1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use anyhow::{anyhow, Context, Result};

pub struct Vault {
    path: String,
    subpath: Option<String>,
    write: Option<serde_json::Value>,
}

impl Vault {
    pub fn get_value(&self) -> Result<serde_json::Value> {
        todo!("get_value for vault");
    }
}

impl TryFrom<&serde_json::Value> for Vault {
    type Error = anyhow::Error;
    fn try_from(value: &serde_json::Value) -> Result<Self, Self::Error> {
        if let serde_json::Value::Object(v) = value {
            let mut result = Vault {
                path: "".to_owned(),
                subpath: None,
                write: None,
            };
            if !v.contains_key("path") {
                return Err(anyhow!("A @vault must have a 'path' key"));
            }
            if let Some(write) = v.get("write") {
                result.write = Some(write.to_owned());
            }
            if let Some(subpath) = v.get("subpath") {
                if !subpath.is_string() {
                    return Err(anyhow!("A @vault's 'subpath' must be a string"));
                }
                result.subpath = Some(subpath.as_str().unwrap().to_string());
            }
            return Ok(result);
        }
        return Err(anyhow!("An @vault must be an object"));
    }
}