stdweb/ecosystem/
serde_json.rs

1use std::collections::BTreeMap;
2use serde_json::value::Value as JsonValue;
3use webcore::value::Value;
4use webcore::try_from::{TryFrom, TryInto};
5use webcore::number::ConversionError;
6
7impl TryFrom< JsonValue > for Value {
8    type Error = ConversionError;
9
10    #[inline]
11    fn try_from( value: JsonValue ) -> Result< Self, Self::Error > {
12        let result = match value {
13            JsonValue::Null => Value::Null,
14            JsonValue::Bool( value ) => Value::Bool( value ),
15            JsonValue::Number( value ) => {
16                if let Some( value ) = value.as_u64() {
17                    Value::Number( value.try_into()? )
18                } else if let Some( value ) = value.as_i64() {
19                    Value::Number( value.try_into()? )
20                } else {
21                    Value::Number( value.as_f64().unwrap().into() )
22                }
23            },
24            JsonValue::String( value ) => Value::String( value ),
25            JsonValue::Array( value ) => {
26                let mut vector: Vec< Value > = Vec::new();
27
28                vector.reserve( value.len() );
29                for element in value.into_iter() {
30                    vector.push( element.try_into()? );
31                }
32
33                vector.into()
34            },
35            JsonValue::Object( value ) => {
36                let mut map: BTreeMap< String, Value > = BTreeMap::new();
37                for (key, value) in value.into_iter() {
38                    map.insert( key.into(), value.try_into()? );
39                }
40
41                map.into()
42            }
43        };
44
45        Ok( result )
46    }
47}