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}