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}