serde_select/
object.rs

1use crate::error::*;
2
3use serde::Serialize;
4use serde::Deserialize;
5
6pub enum ObjectType {
7    Atom,
8    Map,
9    Array,
10}
11
12pub trait Object<'doc>: Serialize + Deserialize<'doc> + Clone {
13    fn get_type(&self) -> ObjectType;
14    fn has_key(&self, key: &str) -> bool;
15    fn has_index(&self, idx: usize) -> bool;
16
17    fn at_index<'a>(&'a self, idx: usize) -> Result<Option<&'a Self>>;
18    fn at_index_mut<'a>(&'a mut self, idx: usize) -> Result<Option<&'a mut Self>>;
19    fn at_key<'a>(&'a self, key: &str) -> Result<Option<&'a Self>>;
20    fn at_key_mut<'a>(&'a mut self, key: &str) -> Result<Option<&'a mut Self>>;
21
22    fn array_len(&self) -> Option<usize>;
23}
24
25#[cfg(feature = "backend_toml")]
26impl<'doc> Object<'doc> for toml::Value {
27    fn get_type(&self) -> ObjectType {
28        match self {
29            toml::Value::Boolean(_)
30                | toml::Value::Datetime(_)
31                | toml::Value::Float(_)
32                | toml::Value::Integer(_)
33                | toml::Value::String(_) => ObjectType::Atom,
34
35            toml::Value::Array(_) => ObjectType::Array,
36            toml::Value::Table(_) => ObjectType::Map,
37        }
38    }
39
40    fn has_key(&self, key: &str) -> bool {
41        match self {
42            toml::Value::Table(t) => t.contains_key(key),
43            _ => false
44        }
45    }
46
47    fn has_index(&self, idx: usize) -> bool {
48        match self {
49            toml::Value::Array(a) => a.len() > idx,
50            _ => false
51        }
52    }
53
54    fn at_index<'a>(&'a self, idx: usize) -> Result<Option<&'a Self>> {
55        match self {
56            toml::Value::Array(a) => Ok(a.get(idx)),
57            toml::Value::Table(_) => Err(crate::error::Error::NoIndexInTable(idx)),
58            _ => Err(crate::error::Error::QueryingValueAsArray(idx)),
59        }
60    }
61
62    fn at_index_mut<'a>(&'a mut self, idx: usize) -> Result<Option<&'a mut Self>> {
63        match self {
64            toml::Value::Array(a) => Ok(a.get_mut(idx)),
65            toml::Value::Table(_) => Err(crate::error::Error::NoIndexInTable(idx)),
66            _ => Err(crate::error::Error::QueryingValueAsArray(idx)),
67        }
68    }
69
70    fn at_key<'a>(&'a self, key: &str) -> Result<Option<&'a Self>> {
71        match self {
72            toml::Value::Table(t) => Ok(t.get(key)),
73            toml::Value::Array(_) => Err(crate::error::Error::NoIdentifierInArray(key.to_string())),
74            _ => Err(crate::error::Error::QueryingValueAsTable(key.to_string())),
75        }
76    }
77
78    fn at_key_mut<'a>(&'a mut self, key: &str) -> Result<Option<&'a mut Self>> {
79        match self {
80            toml::Value::Table(t) => Ok(t.get_mut(key)),
81            toml::Value::Array(_) => Err(crate::error::Error::NoIdentifierInArray(key.to_string())),
82            _ => Err(crate::error::Error::QueryingValueAsTable(key.to_string())),
83        }
84    }
85
86    fn array_len(&self) -> Option<usize> {
87        match self {
88            toml::Value::Array(a) => Some(a.len()),
89            _ => None ,
90        }
91    }
92}
93
94
95#[cfg(feature = "backend_serde_json")]
96impl<'doc> Object<'doc> for serde_json::Value {
97    fn get_type(&self) -> ObjectType {
98        match self {
99            serde_json::Value::Null
100                | serde_json::Value::Bool(_)
101                | serde_json::Value::Number(_)
102                | serde_json::Value::String(_) => ObjectType::Atom,
103
104            serde_json::Value::Array(_) => ObjectType::Array,
105            serde_json::Value::Object(_) => ObjectType::Map,
106        }
107    }
108
109    fn has_key(&self, key: &str) -> bool {
110        match self {
111            serde_json::Value::Object(t) => t.contains_key(key),
112            _ => false
113        }
114    }
115
116    fn has_index(&self, idx: usize) -> bool {
117        match self {
118            serde_json::Value::Array(a) => a.len() > idx,
119            _ => false
120        }
121    }
122
123    fn at_index<'a>(&'a self, idx: usize) -> Result<Option<&'a Self>> {
124        match self {
125            serde_json::Value::Array(a) => Ok(a.get(idx)),
126            serde_json::Value::Object(_) => Err(crate::error::Error::NoIndexInTable(idx)),
127            _ => Err(crate::error::Error::QueryingValueAsArray(idx)),
128        }
129    }
130
131    fn at_index_mut<'a>(&'a mut self, idx: usize) -> Result<Option<&'a mut Self>> {
132        match self {
133            serde_json::Value::Array(a) => Ok(a.get_mut(idx)),
134            serde_json::Value::Object(_) => Err(crate::error::Error::NoIndexInTable(idx)),
135            _ => Err(crate::error::Error::QueryingValueAsArray(idx)),
136        }
137    }
138
139    fn at_key<'a>(&'a self, key: &str) -> Result<Option<&'a Self>> {
140        match self {
141            serde_json::Value::Object(t) => Ok(t.get(key)),
142            serde_json::Value::Array(_) => Err(crate::error::Error::NoIdentifierInArray(key.to_string())),
143            _ => Err(crate::error::Error::QueryingValueAsTable(key.to_string())),
144        }
145    }
146
147    fn at_key_mut<'a>(&'a mut self, key: &str) -> Result<Option<&'a mut Self>> {
148        match self {
149            serde_json::Value::Object(t) => Ok(t.get_mut(key)),
150            serde_json::Value::Array(_) => Err(crate::error::Error::NoIdentifierInArray(key.to_string())),
151            _ => Err(crate::error::Error::QueryingValueAsTable(key.to_string())),
152        }
153    }
154
155    fn array_len(&self) -> Option<usize> {
156        match self {
157            serde_json::Value::Array(a) => Some(a.len()),
158            _ => None ,
159        }
160    }
161}
162