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}