Skip to main content

json_value_resolve/
lib.rs

1extern crate serde_json;
2
3use serde_json::Value;
4
5/// Trait used to resolve scalar char into a json value with the good value.
6///
7/// A scalar type represents a single value.
8/// Rust has four primary scalar types: integers, floating-point numbers, Booleans, and characters.
9/// You may recognize these from other programming languages. Let’s jump into how they work in Rust.
10///
11pub trait Resolve {
12    /// Method use to resolve a scalar char into a json value.
13    ///
14    /// # Examples:
15    ///
16    /// ```ignore
17    /// let string_value = "-00010000".to_string();
18    /// let json_value = Value::resolve(string_value);
19    /// assert_eq!(-10000, json_value.as_i64().unwrap());
20    /// ```
21    fn resolve(value: String) -> Value;
22}
23
24impl Resolve for serde_json::Value {
25    fn resolve(scalar_char: String) -> Value {
26        match scalar_char.parse::<u64>() {
27            Ok(value) => return Value::Number(serde_json::Number::from(value)),
28            Err(_) => (),
29        };
30        match scalar_char.parse::<i64>() {
31            Ok(value) => return Value::Number(serde_json::Number::from(value)),
32            Err(_) => (),
33        };
34        match scalar_char.parse::<f64>() {
35            Ok(value) => {
36                if let Some(value) = serde_json::Number::from_f64(value) {
37                    return Value::Number(value);
38                }
39            }
40            Err(_) => (),
41        };
42        match scalar_char.parse::<bool>() {
43            Ok(value) => return Value::Bool(value),
44            Err(_) => (),
45        };
46        match scalar_char.as_ref() {
47            "null" => return Value::Null,
48            _ => (),
49        };
50        match serde_json::from_str(scalar_char.as_str()) {
51            Ok(value) => return value,
52            _ => (),
53        }
54
55        Value::String(scalar_char)
56    }
57}
58
59#[cfg(test)]
60mod serde_json_value_updater_test {
61    use super::*;
62    #[test]
63    fn it_should_resolve_scalar_null() {
64        let string_value = "null".to_string();
65        let json_value = Value::resolve(string_value);
66        assert_eq!((), json_value.as_null().unwrap());
67    }
68    #[test]
69    fn it_should_resolve_scalar_unsigned_number() {
70        let string_value = "10".to_string();
71        let json_value = Value::resolve(string_value);
72        assert_eq!(10, json_value.as_u64().unwrap());
73    }
74    #[test]
75    fn it_should_resolve_scalar_signed_number() {
76        let string_value = "-00010000".to_string();
77        let json_value = Value::resolve(string_value);
78        assert_eq!(-10000, json_value.as_i64().unwrap());
79    }
80    #[test]
81    fn it_should_resolve_scalar_float() {
82        let string_value = "10.50".to_string();
83        let json_value = Value::resolve(string_value);
84        assert_eq!(10.50, json_value.as_f64().unwrap());
85    }
86    #[test]
87    fn it_should_resolve_scalar_signed_float_number() {
88        let string_value = "-10.50".to_string();
89        let json_value = Value::resolve(string_value);
90        assert_eq!(-10.50, json_value.as_f64().unwrap());
91    }
92    #[test]
93    fn it_should_resolve_string_boolean() {
94        let string_value = "true".to_string();
95        let json_value = Value::resolve(string_value);
96        assert_eq!(true, json_value.as_bool().unwrap());
97    }
98    #[test]
99    fn it_should_resolve_json_value_string() {
100        let string_value = "my string".to_string();
101        let json_value = Value::resolve(string_value);
102        assert_eq!("my string", json_value.as_str().unwrap());
103    }
104    #[test]
105    fn it_should_resolve_json_value_object() {
106        let string_object = r#"{"field":"value"}"#.to_string();
107        let json_value = Value::resolve(string_object);
108        assert_eq!(r#"{"field":"value"}"#, json_value.to_string());
109    }
110}