use crate::error::*; use serde::Serialize; use serde::Deserialize; pub enum ObjectType { Atom, Map, Array, } pub trait Object<'doc>: Serialize + Deserialize<'doc> + Clone { fn get_type(&self) -> ObjectType; fn has_key(&self, key: &str) -> bool; fn has_index(&self, idx: usize) -> bool; fn at_index<'a>(&'a self, idx: usize) -> Result>; fn at_index_mut<'a>(&'a mut self, idx: usize) -> Result>; fn at_key<'a>(&'a self, key: &str) -> Result>; fn at_key_mut<'a>(&'a mut self, key: &str) -> Result>; fn array_len(&self) -> Option; } #[cfg(feature = "backend_toml")] impl<'doc> Object<'doc> for toml::Value { fn get_type(&self) -> ObjectType { match self { toml::Value::Boolean(_) | toml::Value::Datetime(_) | toml::Value::Float(_) | toml::Value::Integer(_) | toml::Value::String(_) => ObjectType::Atom, toml::Value::Array(_) => ObjectType::Array, toml::Value::Table(_) => ObjectType::Map, } } fn has_key(&self, key: &str) -> bool { match self { toml::Value::Table(t) => t.contains_key(key), _ => false } } fn has_index(&self, idx: usize) -> bool { match self { toml::Value::Array(a) => a.len() > idx, _ => false } } fn at_index<'a>(&'a self, idx: usize) -> Result> { match self { toml::Value::Array(a) => Ok(a.get(idx)), toml::Value::Table(_) => Err(crate::error::Error::NoIndexInTable(idx)), _ => Err(crate::error::Error::QueryingValueAsArray(idx)), } } fn at_index_mut<'a>(&'a mut self, idx: usize) -> Result> { match self { toml::Value::Array(a) => Ok(a.get_mut(idx)), toml::Value::Table(_) => Err(crate::error::Error::NoIndexInTable(idx)), _ => Err(crate::error::Error::QueryingValueAsArray(idx)), } } fn at_key<'a>(&'a self, key: &str) -> Result> { match self { toml::Value::Table(t) => Ok(t.get(key)), toml::Value::Array(_) => Err(crate::error::Error::NoIdentifierInArray(key.to_string())), _ => Err(crate::error::Error::QueryingValueAsTable(key.to_string())), } } fn at_key_mut<'a>(&'a mut self, key: &str) -> Result> { match self { toml::Value::Table(t) => Ok(t.get_mut(key)), toml::Value::Array(_) => Err(crate::error::Error::NoIdentifierInArray(key.to_string())), _ => Err(crate::error::Error::QueryingValueAsTable(key.to_string())), } } fn array_len(&self) -> Option { match self { toml::Value::Array(a) => Some(a.len()), _ => None , } } } #[cfg(feature = "backend_serde_json")] impl<'doc> Object<'doc> for serde_json::Value { fn get_type(&self) -> ObjectType { match self { serde_json::Value::Null | serde_json::Value::Bool(_) | serde_json::Value::Number(_) | serde_json::Value::String(_) => ObjectType::Atom, serde_json::Value::Array(_) => ObjectType::Array, serde_json::Value::Object(_) => ObjectType::Map, } } fn has_key(&self, key: &str) -> bool { match self { serde_json::Value::Object(t) => t.contains_key(key), _ => false } } fn has_index(&self, idx: usize) -> bool { match self { serde_json::Value::Array(a) => a.len() > idx, _ => false } } fn at_index<'a>(&'a self, idx: usize) -> Result> { match self { serde_json::Value::Array(a) => Ok(a.get(idx)), serde_json::Value::Object(_) => Err(crate::error::Error::NoIndexInTable(idx)), _ => Err(crate::error::Error::QueryingValueAsArray(idx)), } } fn at_index_mut<'a>(&'a mut self, idx: usize) -> Result> { match self { serde_json::Value::Array(a) => Ok(a.get_mut(idx)), serde_json::Value::Object(_) => Err(crate::error::Error::NoIndexInTable(idx)), _ => Err(crate::error::Error::QueryingValueAsArray(idx)), } } fn at_key<'a>(&'a self, key: &str) -> Result> { match self { serde_json::Value::Object(t) => Ok(t.get(key)), serde_json::Value::Array(_) => Err(crate::error::Error::NoIdentifierInArray(key.to_string())), _ => Err(crate::error::Error::QueryingValueAsTable(key.to_string())), } } fn at_key_mut<'a>(&'a mut self, key: &str) -> Result> { match self { serde_json::Value::Object(t) => Ok(t.get_mut(key)), serde_json::Value::Array(_) => Err(crate::error::Error::NoIdentifierInArray(key.to_string())), _ => Err(crate::error::Error::QueryingValueAsTable(key.to_string())), } } fn array_len(&self) -> Option { match self { serde_json::Value::Array(a) => Some(a.len()), _ => None , } } }