1use rand::SeedableRng;
2use rand::seq::IndexedRandom;
3
4use crate::prelude::*;
5
6#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, Tsify)]
7pub struct UsernameGenerationSettings {
8 #[schemars(title = "Список префиксов")]
9 pub prefixes: Vec<String>,
10
11 #[schemars(title = "Список суффиксов")]
12 pub suffixes: Vec<String>,
13
14 #[schemars(title = "Шаблон имени")]
15 pub template: String,
16}
17
18#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, Tsify)]
19pub struct PhotoGenerationSettings {
20 #[schemars(title = "Список шаблонов фото")]
21 pub templates: Vec<String>,
22}
23
24#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, Tsify)]
25pub struct BotsSettings {
26 #[schemars(title = "Настройки генерации имени")]
27 pub username_generation_settings: UsernameGenerationSettings,
28
29 #[schemars(title = "Настройки генерации фото")]
30 pub photo_generation_settings: PhotoGenerationSettings,
31}
32
33#[derive(Clone, Debug, Deserialize, Serialize, JsonSchema, Tsify)]
34pub struct UsersGeneratingSettings {
35 #[schemars(title = "Настройки генерации имени")]
36 pub username_generation_settings: UsernameGenerationSettings,
37
38 #[schemars(title = "Настройки генерации фото")]
39 pub photo_generation_settings: PhotoGenerationSettings,
40}
41
42pub fn generate_username(
43 username_generation: &UsernameGenerationSettings,
44) -> anyhow::Result<String> {
45 let mut rng =
46 rand::rngs::StdRng::try_from_rng(&mut rand::rngs::SysRng).expect("OS entropy unavailable");
47
48 let prefix = username_generation
49 .prefixes
50 .choose(&mut rng)
51 .ok_or(anyhow::anyhow!("Failed to generate username prefix"))?;
52
53 let suffix = username_generation
54 .suffixes
55 .choose(&mut rng)
56 .ok_or(anyhow::anyhow!("Failed to generate username suffix"))?;
57
58 let mut vars = std::collections::HashMap::new();
59 vars.insert("prefix".to_string(), prefix.to_string());
60 vars.insert("suffix".to_string(), suffix.to_string());
61
62 Ok(strfmt::strfmt(&username_generation.template, &vars)?)
63}
64
65pub fn generate_photo_url(photo_generation: &PhotoGenerationSettings) -> anyhow::Result<String> {
66 let mut rng =
67 rand::rngs::StdRng::try_from_rng(&mut rand::rngs::SysRng).expect("OS entropy unavailable");
68
69 let template = photo_generation
70 .templates
71 .choose(&mut rng)
72 .ok_or(anyhow::anyhow!("Failed to generate photo template"))?;
73
74 Ok(template.to_string())
75}