json_api/value/
convert.rs1use serde::de::DeserializeOwned;
4use serde::ser::Serialize;
5use serde_json::{self, Value as JsonValue};
6
7use error::Error;
8use value::Value;
9
10pub fn to_value<T>(value: T) -> Result<Value, Error>
12where
13 T: Serialize,
14{
15 from_json(serde_json::to_value(value)?)
16}
17
18pub 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}