serde_extensions/
lib.rs

1pub use serde_extensions_derive::*;
2
3pub trait Overwrite {
4    fn overwrite<'de, D>(&mut self, d: D) -> Result<(), D::Error>
5    where
6        D: serde::Deserializer<'de>;
7}
8
9#[cfg(test)]
10mod tests {
11    use std::{collections::HashMap, path::PathBuf};
12
13    use super::Overwrite;
14    use toml::Value;
15
16    #[derive(Debug, Overwrite)]
17    struct Test {
18        a: PathBuf,
19        b: String,
20        c: Vec<String>,
21        d: u32,
22        e: HashMap<String, String>,
23    }
24
25    const TEST_TOML: &'static str = r#"
26a = "/test/asdf"
27c = ["c", "c"]
28[e]
29test="asdf"
30"#;
31
32    #[test]
33    pub fn overwrite_works() {
34        let mut e = HashMap::new();
35        e.insert("test", "fdsa");
36        let mut test = Test {
37            a: PathBuf::default(),
38            b: "b".into(),
39            c: vec!["asdf".into()],
40            d: 0,
41            e: HashMap::new(),
42        };
43        let value: Value = toml::from_str(TEST_TOML).unwrap();
44        test.overwrite(value).unwrap();
45
46        assert_eq!(
47            format!("{test:?}"),
48            r#"Test { a: "/test/asdf", b: "b", c: ["c", "c"], d: 0, e: {"test": "asdf"} }"#
49        )
50    }
51}