hocon_rs/
transform.rs

1use crate::value::Value;
2use serde_json::Number;
3use std::{collections::HashMap, iter::once};
4
5impl From<i64> for Value {
6    fn from(value: i64) -> Self {
7        Value::Number(value.into())
8    }
9}
10
11impl From<i32> for Value {
12    fn from(value: i32) -> Self {
13        Value::Number(value.into())
14    }
15}
16
17impl From<String> for Value {
18    fn from(value: String) -> Self {
19        Value::String(value)
20    }
21}
22
23impl From<&str> for Value {
24    fn from(value: &str) -> Self {
25        Value::String(value.to_string())
26    }
27}
28
29impl From<bool> for Value {
30    fn from(value: bool) -> Self {
31        Value::Boolean(value)
32    }
33}
34
35impl From<f64> for Value {
36    fn from(value: f64) -> Self {
37        Number::from_f64(value).map_or(Value::Null, Value::Number)
38    }
39}
40
41impl From<HashMap<String, Value>> for Value {
42    fn from(value: HashMap<String, Value>) -> Self {
43        Value::Object(value)
44    }
45}
46
47impl From<(String, Value)> for Value {
48    fn from(value: (String, Value)) -> Self {
49        Value::Object(HashMap::from_iter(once(value)))
50    }
51}
52
53impl From<(&str, Value)> for Value {
54    fn from(value: (&str, Value)) -> Self {
55        let (k, v) = value;
56        Value::Object(HashMap::from_iter(once((k.to_string(), v))))
57    }
58}
59
60impl From<Vec<(String, Value)>> for Value {
61    fn from(value: Vec<(String, Value)>) -> Self {
62        Value::Object(HashMap::from_iter(value))
63    }
64}
65
66impl From<Vec<(&str, Value)>> for Value {
67    fn from(value: Vec<(&str, Value)>) -> Self {
68        Value::Object(value.into_iter().map(|(k, v)| (k.to_string(), v)).collect())
69    }
70}
71
72impl From<Vec<Value>> for Value {
73    fn from(value: Vec<Value>) -> Self {
74        Value::Array(value)
75    }
76}
77
78impl From<Number> for Value {
79    fn from(value: Number) -> Self {
80        Value::Number(value)
81    }
82}
83
84impl From<serde_json::Value> for Value {
85    fn from(val: serde_json::Value) -> Self {
86        match val {
87            serde_json::Value::Null => Value::Null,
88            serde_json::Value::Bool(boolean) => Value::Boolean(boolean),
89            serde_json::Value::Number(number) => Value::Number(number),
90            serde_json::Value::String(string) => Value::String(string),
91            serde_json::Value::Array(array) => {
92                Value::array_from_iter(array.into_iter().map(Into::into))
93            }
94            serde_json::Value::Object(object) => {
95                Value::object_from_iter(object.into_iter().map(|(key, value)| (key, value.into())))
96            }
97        }
98    }
99}
100
101impl From<Value> for serde_json::Value {
102    fn from(val: Value) -> Self {
103        match val {
104            Value::Object(object) => {
105                let map = serde_json::Map::from_iter(
106                    object.into_iter().map(|(key, value)| (key, value.into())),
107                );
108                serde_json::Value::Object(map)
109            }
110            Value::Array(array) => {
111                serde_json::Value::Array(array.into_iter().map(Into::into).collect())
112            }
113            Value::Boolean(boolean) => serde_json::Value::Bool(boolean),
114            Value::Null => serde_json::Value::Null,
115            Value::String(string) => serde_json::Value::String(string),
116            Value::Number(number) => serde_json::Value::Number(number),
117        }
118    }
119}