json_api/value/
convert.rs

1//! Functions that convert types to and from a `Value`.
2
3use serde::de::DeserializeOwned;
4use serde::ser::Serialize;
5use serde_json::{self, Value as JsonValue};
6
7use error::Error;
8use value::Value;
9
10/// Convert a `T` into a `Value`.
11pub fn to_value<T>(value: T) -> Result<Value, Error>
12where
13    T: Serialize,
14{
15    from_json(serde_json::to_value(value)?)
16}
17
18/// Interpret a `Value` as a type `T`.
19pub fn from_value<T>(value: Value) -> Result<T, Error>
20where
21    T: DeserializeOwned,
22{
23    Ok(T::deserialize(to_json(value))?)
24}
25
26pub(crate) fn to_json(value: Value) -> JsonValue {
27    match value {
28        Value::Null => JsonValue::Null,
29        Value::Array(inner) => inner.into_iter().map(to_json).collect(),
30        Value::Bool(inner) => JsonValue::Bool(inner),
31        Value::Number(inner) => JsonValue::Number(inner),
32        Value::Object(inner) => {
33            let map = inner
34                .into_iter()
35                .map(|(k, v)| (String::from(k), to_json(v)))
36                .collect();
37
38            JsonValue::Object(map)
39        }
40        Value::String(inner) => JsonValue::String(inner),
41    }
42}
43
44pub(crate) fn from_json(value: JsonValue) -> Result<Value, Error> {
45    match value {
46        JsonValue::Null => Ok(Value::Null),
47        JsonValue::Array(data) => data.into_iter().map(from_json).collect(),
48        JsonValue::Bool(data) => Ok(Value::Bool(data)),
49        JsonValue::Number(data) => Ok(Value::Number(data)),
50        JsonValue::Object(data) => data.into_iter()
51            .map(|(k, v)| Ok((k.parse()?, from_json(v)?)))
52            .collect(),
53        JsonValue::String(data) => Ok(Value::String(data)),
54    }
55}