sheesy_tools/process/
types.rs1use 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}