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"));
}
}