sheesy_tools/process/
types.rs

1use failure::Error;
2use json;
3
4use std::path::PathBuf;
5use std::str::FromStr;
6
7use glob;
8use std::borrow::Cow;
9use std::fmt;
10use treediff::tools::MutableFilter;
11
12#[derive(Default)]
13pub struct State {
14    pub select_next_at: Option<String>,
15    pub insert_next_at: Option<String>,
16    pub output_mode: Option<OutputMode>,
17    pub merge_mode: MergeMode,
18    pub value: Option<json::Value>,
19    pub buffer: Vec<json::Value>,
20}
21
22#[derive(Debug, Clone)]
23pub enum MergeMode {
24    Overwrite,
25    NoOverwrite,
26}
27
28impl Default for MergeMode {
29    fn default() -> Self {
30        MergeMode::NoOverwrite
31    }
32}
33
34#[derive(Debug)]
35pub enum Command {
36    MergeValue(String, String),
37    InsertNextMergeAt(String),
38    SelectNextMergeAt(String),
39    SelectToBuffer(String),
40    MergeStdin,
41    MergePath(PathBuf),
42    MergeEnvironment(glob::Pattern),
43    SetMergeMode(MergeMode),
44    Serialize,
45    SerializeBuffer,
46    SetOutputMode(OutputMode),
47}
48
49#[derive(Debug)]
50pub enum OutputMode {
51    Json,
52    Yaml,
53}
54
55impl Default for OutputMode {
56    fn default() -> Self {
57        OutputMode::Json
58    }
59}
60
61impl FromStr for OutputMode {
62    type Err = Error;
63
64    fn from_str(s: &str) -> Result<Self, Self::Err> {
65        Ok(match s.to_lowercase().as_str() {
66            "json" => OutputMode::Json,
67            "yaml" => OutputMode::Yaml,
68            _ => bail!("Not a valid output mode: '{}'", s),
69        })
70    }
71}
72
73pub struct NeverDrop {
74    pub mode: MergeMode,
75    pub clashed_keys: Vec<String>,
76}
77
78impl NeverDrop {
79    pub fn with_mode(mode: &MergeMode) -> Self {
80        NeverDrop {
81            mode: mode.clone(),
82            clashed_keys: Vec::new(),
83        }
84    }
85}
86
87impl fmt::Display for NeverDrop {
88    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
89        writeln!(f, "Refusing to merge due to the following clashing keys:")?;
90        for key in &self.clashed_keys {
91            writeln!(f, "{}\n", key)?;
92        }
93        Ok(())
94    }
95}
96
97impl MutableFilter for NeverDrop {
98    fn resolve_conflict<'a, K: fmt::Display, V: Clone>(
99        &mut self,
100        keys: &[K],
101        old: &'a V,
102        new: &'a V,
103        _self_of_whole_value: &mut V,
104    ) -> Option<Cow<'a, V>> {
105        match self.mode {
106            MergeMode::NoOverwrite => {
107                self.clashed_keys
108                    .push(keys.iter().map(|k| format!("{}", k)).collect::<Vec<_>>().join("."));
109                Some(Cow::Borrowed(old))
110            }
111            MergeMode::Overwrite => Some(Cow::Borrowed(new)),
112        }
113    }
114
115    fn resolve_removal<'a, K: fmt::Display, V: Clone>(
116        &mut self,
117        _keys: &[K],
118        removed: &'a V,
119        _self_of_whole_value: &mut V,
120    ) -> Option<Cow<'a, V>> {
121        Some(Cow::Borrowed(removed))
122    }
123}