omni_git/
git_app.rs

1use std::collections::HashMap;
2
3#[derive(serde::Deserialize, serde::Serialize)]
4#[serde(default)]
5pub struct GitApp {
6    pub selected_gits_app: GitApps,
7    #[serde(skip)]
8    pub choosen: ChoosenTagSymbols,
9    #[serde(skip)]
10    pub choosen_other: ChoosenTagSymbols,
11    pub owner: String,
12    pub base_url: String,
13    pub repo: String,
14}
15
16impl Default for GitApp {
17    fn default() -> Self {
18        Self {
19            selected_gits_app: GitApps::TagDiffWeb,
20            choosen: ChoosenTagSymbols::default(),
21            choosen_other: ChoosenTagSymbols::default(),
22            base_url: "https://github.com".to_owned(),
23            owner: "".to_owned(),
24            repo: "".to_owned(),
25        }
26    }
27}
28
29#[derive(Debug, PartialEq, serde::Deserialize, serde::Serialize)]
30pub enum GitApps {
31    TagDiffWeb,
32    TagDiffCommand,
33}
34
35#[derive(Clone, PartialEq)]
36pub struct TagSymbol {
37    pub order: u16,
38    pub name: String,
39    pub symbol: String,
40}
41
42impl TagSymbol {
43    pub fn new(order: u16, name: &str, symbol: &str) -> TagSymbol {
44        TagSymbol {
45            order,
46            name: name.to_owned(),
47            symbol: symbol.to_owned(),
48        }
49    }
50}
51
52#[derive(Default, Clone)]
53pub struct ChoosenTagSymbols {
54    pub symbols: HashMap<String, TagSymbol>,
55}
56
57impl ChoosenTagSymbols {
58    pub fn choose(&mut self, choose: TagSymbol) {
59        self.symbols.insert(choose.name.clone(), choose);
60    }
61
62    pub fn get_choosen_symbols(&mut self) -> Vec<TagSymbol> {
63        let mut values: Vec<TagSymbol> = self.symbols.values().cloned().collect();
64        values.sort_by(|a, b| a.order.cmp(&b.order));
65        values.into_iter().collect()
66    }
67
68    pub fn get_choosen_symbol_chain(&self) -> String {
69        let mut values: Vec<TagSymbol> = self.symbols.values().cloned().collect();
70        values.sort_by(|a, b| a.order.cmp(&b.order));
71        let strings: Vec<String> = values.into_iter().map(|tuple| tuple.symbol).collect();
72        strings.concat()
73    }
74
75    pub fn take_over(&mut self, other: &ChoosenTagSymbols) {
76        for symbol in other.clone().get_choosen_symbols() {
77            self.symbols.insert(symbol.name.clone(), symbol);
78        }
79    }
80}
81
82#[cfg(test)]
83mod tests {
84
85    use super::*;
86
87    #[test]
88    fn should_return_symbols_in_correct_order() {
89        let mut chooser = ChoosenTagSymbols::default();
90        chooser.choose(TagSymbol::new(1, "prefix", "something"));
91        chooser.choose(TagSymbol::new(2, "delitmiter", "/"));
92        chooser.choose(TagSymbol::new(3, "version", "someversion"));
93
94        let tag = chooser.get_choosen_symbol_chain();
95        assert_eq!(tag, "something/someversion")
96    }
97
98    #[test]
99    fn should_take_over_symbols() {
100        let mut chooser = ChoosenTagSymbols::default();
101        chooser.choose(TagSymbol::new(1, "prefix", "something"));
102        chooser.choose(TagSymbol::new(2, "delitmiter", "/"));
103        chooser.choose(TagSymbol::new(3, "version", "someversion"));
104
105        let mut other_chooser = ChoosenTagSymbols::default();
106        other_chooser.take_over(&chooser);
107        assert_eq!(
108            other_chooser.get_choosen_symbol_chain(),
109            chooser.get_choosen_symbol_chain()
110        )
111    }
112}