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}