passgen/
data.rs

1use crate::{markov::Markov, pattern::Special, wordlist::Wordlist, Config};
2use std::collections::BTreeMap;
3use std::sync::Arc;
4
5pub trait Data {
6    fn wordlist(&self, name: &str) -> Option<Arc<Wordlist>> {
7        None
8    }
9
10    fn markov(&self, name: &str) -> Option<Arc<Markov>> {
11        None
12    }
13}
14
15impl Data for () {}
16
17#[derive(Clone, Debug, Default)]
18pub struct DataStore {
19    wordlists: BTreeMap<String, Arc<Wordlist>>,
20    markov: BTreeMap<String, Arc<Markov>>,
21}
22
23impl DataStore {
24    pub fn resolve(&mut self, config: &Config, dependency: &Special) -> Result<(), ()> {
25        match dependency {
26            Special::Wordlist(name) => {
27                if self.wordlist(name).is_none() {
28                    let path = config.wordlist_path(name).unwrap();
29                    let wordlist = Wordlist::load(path).unwrap();
30                    self.wordlists.insert(name.clone(), Arc::new(wordlist));
31                }
32            }
33            Special::Markov(name) => {
34                if self.markov(name).is_none() {
35                    let path = config.wordlist_path(name).unwrap();
36                    let markov = Markov::load(path, 2).unwrap();
37                    self.markov.insert(name.clone(), Arc::new(markov));
38                }
39            }
40            _ => {}
41        }
42        Ok(())
43    }
44}
45
46impl Data for DataStore {
47    fn wordlist(&self, name: &str) -> Option<Arc<Wordlist>> {
48        self.wordlists.get(name).cloned()
49    }
50
51    fn markov(&self, name: &str) -> Option<Arc<Markov>> {
52        self.markov.get(name).cloned()
53    }
54}