use std::collections::BTreeMap; use serde::Serialize; #[derive(Clone, PartialEq, Eq, Debug, Serialize)] #[serde(untagged)] pub enum Value { String(String), Bool(bool), Array(Vec), Map(BTreeMap), } impl From<&toml::Value> for Value { fn from(value: &toml::Value) -> Self { match value { toml::Value::String(s) => Self::String(s.clone()), toml::Value::Integer(i) => Self::String(i.to_string()), toml::Value::Float(f) => Self::String(f.to_string()), toml::Value::Boolean(b) => Self::Bool(*b), toml::Value::Datetime(dt) => Self::String(dt.to_string()), toml::Value::Array(array) => Self::Array(array.iter().map(|i| i.into()).collect()), toml::Value::Table(tbl) => { Self::Map(tbl.iter().map(|(k, v)| (k.clone(), v.into())).collect()) } } } } impl Value { pub fn get(&self, path: &[&str]) -> Option<&Value> { match path.split_first() { Some((current, rest)) => match self { Value::Map(map) => match map.get(¤t.to_string()) { Some(value) => value.get(rest), None => None, }, _ => None, }, None => Some(self), } } }