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