meme_rs/
config.rs

1#[derive(Debug, Clone, serde::Deserialize)]
2pub struct Config {
3    pub input_dir: String,
4    pub output_dir: String,
5    #[serde(default)]
6    pub common_texts: Vec<String>,
7    pub images: Vec<ImageConfig>,
8}
9
10#[derive(Debug, Clone, serde::Deserialize)]
11pub struct ImageConfig {
12    pub name: String,
13    #[serde(default)]
14    pub texts: Vec<String>,
15    #[serde(default)]
16    pub raw: bool,
17}
18
19impl Config {
20    pub fn load() -> Self {
21        let f = std::fs::File::open("config.yml").expect("failed opening config file");
22        serde_yaml::from_reader(f).expect("failed parsing config file")
23    }
24
25    pub fn create_uniform_distribution(&self) -> Vec<MemeIndex> {
26        let mut uniform_dist = vec![];
27        for (idx, c) in self.images.iter().enumerate() {
28            if c.raw {
29                uniform_dist.push(MemeIndex::new(idx, 0));
30            } else {
31                for t_idx in 0..self.common_texts.len() {
32                    uniform_dist.push(MemeIndex::new(idx, t_idx));
33                }
34                for t_idx in 0..c.texts.len() {
35                    uniform_dist.push(MemeIndex::new(idx, self.common_texts.len() + t_idx));
36                }
37            }
38        }
39        uniform_dist
40    }
41}
42
43#[derive(Debug, Clone)]
44pub struct MemeIndex {
45    pub image_idx: usize,
46    pub text_idx: usize,
47}
48
49impl MemeIndex {
50    pub fn new(image_idx: usize, text_idx: usize) -> Self {
51        MemeIndex {
52            image_idx,
53            text_idx,
54        }
55    }
56}