use serde_json::{Value, Map}; use serde::{Deserialize, Serialize}; use std::convert::From; #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] enum Aliases { One(String), More(Vec), } #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] enum Domain { Name(String), Config(DomainConfig), } #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] struct DomainConfig { hostname: String, alias: Option, web: Option, } #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] enum Web { Template(String), Config(WebConfig) } #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] struct WebConfig { template: Option, vars: Map, } #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] struct MyTilde { domains: Vec, } #[derive(Debug)] enum Error { File(std::io::Error), Json(serde_json::Error), } impl From for Error { fn from(e: std::io::Error) -> Error { Error::File(e) } } impl From for Error { fn from(e: serde_json::Error) -> Error { Error::Json(e) } } impl MyTilde { fn from_file>(path: P) -> Result { let content = std::fs::read_to_string(path)?; let json: Value = serde_json::from_str(&content)?; Ok(serde_json::from_value(json)?) } }