1mod serde;
19
20pub use self::serde::{to_value, from_value};
21
22use table::Table;
23
24#[derive(Debug, Clone, PartialEq)]
33pub enum Value {
34
35 Null,
37
38 Boolean(bool),
46
47 Integer(i64),
58
59 Number(f64),
68
69 Text(String),
78
79 List(Vec<Value>),
86
87 Table(Table),
94}
95
96pub trait FromValue<'a>: Sized {
98 fn from_value(value: &'a Value) -> Option<Self>;
101}
102
103pub trait FromValueMut<'a>: Sized {
105 fn from_value_mut(value: &'a mut Value) -> Option<Self>;
108}
109
110impl <'a, T> FromValue<'a> for T
111where
112 T: From<&'a Value>,
113{
114 fn from_value(value: &'a Value) -> Option<T> {
115 Some(T::from(value))
116 }
117}
118
119impl<'a, T> FromValueMut<'a> for T
120where
121 T: FromValue<'a>,
122{
123 fn from_value_mut(value: &'a mut Value) -> Option<T> {
124 T::from_value(value)
125 }
126}
127
128impl From<bool> for Value {
129 fn from(x: bool) -> Value {
130 Value::Boolean(x)
131 }
132}
133
134impl<'a> FromValue<'a> for bool {
135 fn from_value(value: &'a Value) -> Option<bool> {
136 match value {
137 Value::Boolean(x) => Some(*x),
138 Value::Integer(x) => Some(*x != 0),
139 Value::Text(x) => x.parse().ok(),
140 _ => None,
141 }
142 }
143}
144
145impl From<i64> for Value {
146 fn from(x: i64) -> Value {
147 Value::Integer(x)
148 }
149}
150
151impl<'a> FromValue<'a> for i64 {
152 fn from_value(value: &'a Value) -> Option<i64> {
153 match value {
154 Value::Integer(x) => Some(*x),
155 Value::Number(x) => Some(*x as i64),
156 Value::Text(x) => x.parse().ok(),
157 _ => None,
158 }
159 }
160}
161
162impl From<f64> for Value {
163 fn from(x: f64) -> Value {
164 Value::Number(x)
165 }
166}
167
168impl<'a> FromValue<'a> for f64 {
169 fn from_value(value: &'a Value) -> Option<f64> {
170 match value {
171 Value::Integer(x) => Some(*x as f64),
172 Value::Number(x) => Some(*x),
173 Value::Text(x) => x.parse().ok(),
174 _ => None,
175 }
176 }
177}
178
179impl From<String> for Value {
180 fn from(x: String) -> Value {
181 Value::Text(x)
182 }
183}
184
185impl<'a> FromValue<'a> for &'a String {
186 fn from_value(value: &'a Value) -> Option<&'a String> {
187 match value {
188 Value::Text(x) => Some(x),
189 _ => None,
190 }
191 }
192}
193
194impl<'a> FromValueMut<'a> for &'a mut String {
195 fn from_value_mut(value: &'a mut Value) -> Option<&'a mut String> {
196 match value {
197 Value::Text(x) => Some(x),
198 _ => None,
199 }
200 }
201}
202
203impl<'a> FromValue<'a> for String {
204 fn from_value(value: &'a Value) -> Option<String> {
205 match value {
206 Value::Boolean(x) => Some(x.to_string()),
207 Value::Integer(x) => Some(x.to_string()),
208 Value::Number(x) => Some(x.to_string()),
209 Value::Text(x) => Some(x.to_string()),
210 _ => None,
211 }
212 }
213}
214
215impl From<Vec<Value>> for Value {
216 fn from(x: Vec<Value>) -> Value {
217 Value::List(x)
218 }
219}
220
221impl<'a> FromValue<'a> for &'a Vec<Value> {
222 fn from_value(value: &'a Value) -> Option<&'a Vec<Value>> {
223 match value {
224 Value::List(x) => Some(x),
225 _ => None,
226 }
227 }
228}
229
230impl<'a> FromValueMut<'a> for &'a mut Vec<Value> {
231 fn from_value_mut(value: &'a mut Value) -> Option<&'a mut Vec<Value>> {
232 match value {
233 Value::List(x) => Some(x),
234 _ => None,
235 }
236 }
237}
238
239impl From<Table> for Value {
240 fn from(x: Table) -> Value {
241 Value::Table(x)
242 }
243}
244
245impl<'a> FromValue<'a> for &'a Table {
246 fn from_value(value: &'a Value) -> Option<&'a Table> {
247 match value {
248 Value::Table(x) => Some(x),
249 _ => None,
250 }
251 }
252}
253
254impl<'a> FromValueMut<'a> for &'a mut Table {
255 fn from_value_mut(value: &'a mut Value) -> Option<&'a mut Table> {
256 match value {
257 Value::Table(x) => Some(x),
258 _ => None,
259 }
260 }
261}
262
263impl<T> From<Option<T>> for Value
264where
265 Value: From<T>,
266{
267 fn from(x: Option<T>) -> Value {
268 match x {
269 None => Value::Null,
270 Some(t) => Value::from(t),
271 }
272 }
273}
274
275macro_rules! derive_value {
277 ($x:ty as $($y:ty),*) => {$(
278 impl From<$y> for Value {
279 fn from(y: $y) -> Value {
280 Value::from(y as $x)
281 }
282 }
283
284 impl<'a> FromValue<'a> for $y {
285 fn from_value(value: &'a Value) -> Option<$y> {
286 <$x>::from_value(value)
287 .map(|x| x as $y)
288 }
289 }
290 )*}
291}
292
293derive_value!(i64 as i8, i16, i32, isize, u8, u16, u32, u64, usize);
294derive_value!(f64 as f32);