1use crate::common::hash::fnv;
2use crate::finder::structures::Opts;
3use crate::prelude::*;
4
5pub type Suggestion = (String, Option<Opts>);
6
7#[derive(Clone, Default)]
8pub struct VariableMap {
9 variables: HashMap<u64, HashMap<String, Suggestion>>,
10 dependencies: HashMap<u64, Vec<u64>>,
11}
12
13impl VariableMap {
14 pub fn insert_dependency(&mut self, tags: &str, tags_dependency: &str) {
15 let k = fnv(&tags);
16 if let Some(v) = self.dependencies.get_mut(&k) {
17 v.push(fnv(&tags_dependency));
18 } else {
19 let v: Vec<u64> = vec![fnv(&tags_dependency)];
20 self.dependencies.insert(k, v);
21 }
22 }
23
24 pub fn insert_suggestion(&mut self, tags: &str, variable: &str, value: Suggestion) {
25 let k1 = fnv(&tags);
26 let k2 = String::from(variable);
27 if let Some(m) = self.variables.get_mut(&k1) {
28 m.insert(k2, value);
29 } else {
30 let mut m = HashMap::new();
31 m.insert(k2, value);
32 self.variables.insert(k1, m);
33 }
34 }
35
36 pub fn get_suggestion(&self, tags: &str, variable: &str) -> Option<&Suggestion> {
37 let k = fnv(&tags);
38
39 if let Some(vm) = self.variables.get(&k) {
40 let res = vm.get(variable);
41 if res.is_some() {
42 return res;
43 }
44 }
45
46 if let Some(dependency_keys) = self.dependencies.get(&k) {
47 for dependency_key in dependency_keys {
48 if let Some(vm) = self.variables.get(dependency_key) {
49 let res = vm.get(variable);
50 if res.is_some() {
51 return res;
52 }
53 }
54 }
55 }
56
57 None
58 }
59}