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);