genify/
schema.rs

1use regex::Regex;
2use serde::{
3    ser::{SerializeMap, SerializeSeq},
4    Deserialize, Serialize, Serializer,
5};
6
7#[derive(Clone, Serialize, Debug)]
8pub struct Config {
9    #[serde(default)]
10    pub props: Map,
11    #[serde(default)]
12    pub rules: Vec<Rule>,
13}
14
15#[derive(Clone, Deserialize, Serialize, Debug)]
16#[serde(tag = "type", rename_all = "snake_case")]
17pub enum Rule {
18    File {
19        path: String,
20        content: String,
21    },
22    Append {
23        path: String,
24        content: String,
25    },
26    Prepend {
27        path: String,
28        content: String,
29    },
30    Replace {
31        path: String,
32        #[serde(with = "serde_regex")]
33        replace: Regex,
34        content: String,
35    },
36}
37
38pub type Array = Vec<Value>;
39pub type Map = Vec<(String, Value)>;
40
41#[derive(PartialEq, Clone, Debug)]
42pub enum Value {
43    String(String),
44    Integer(i64),
45    Float(f64),
46    Boolean(bool),
47    Array(Array),
48    Map(Map),
49}
50
51impl Serialize for Value {
52    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
53    where
54        S: Serializer,
55    {
56        match self {
57            Value::String(v) => serializer.serialize_str(v),
58            Value::Integer(v) => serializer.serialize_i64(*v),
59            Value::Float(v) => serializer.serialize_f64(*v),
60            Value::Boolean(v) => serializer.serialize_bool(*v),
61            Value::Array(vec) => {
62                let mut seq = serializer.serialize_seq(Some(vec.len()))?;
63                for e in vec {
64                    seq.serialize_element(e)?;
65                }
66                seq.end()
67            }
68            Value::Map(vec) => {
69                let mut map = serializer.serialize_map(Some(vec.len()))?;
70                for (k, v) in vec {
71                    map.serialize_entry(k, v)?;
72                }
73                map.end()
74            }
75        }
76    }
77}