Skip to main content

navi/structures/
cheat.rs

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}