1use core::iter::FromIterator;
16use std::borrow::Cow;
17
18use ordered_float::OrderedFloat;
19use serde_json::Map as JsonMap;
20use serde_json::Number as JsonNumber;
21use serde_json::Value as JsonValue;
22
23use super::number::Number;
24use super::value::Object;
25use super::value::Value;
26
27macro_rules! from_signed_integer {
28 ($($ty:ident)*) => {
29 $(
30 impl<'a> From<$ty> for Value<'a> {
31 fn from(n: $ty) -> Self {
32 Value::Number(Number::Int64(n as i64))
33 }
34 }
35 )*
36 };
37}
38
39macro_rules! from_unsigned_integer {
40 ($($ty:ident)*) => {
41 $(
42 impl<'a> From<$ty> for Value<'a> {
43 fn from(n: $ty) -> Self {
44 Value::Number(Number::UInt64(n as u64))
45 }
46 }
47 )*
48 };
49}
50
51macro_rules! from_float {
52 ($($ty:ident)*) => {
53 $(
54 impl<'a> From<$ty> for Value<'a> {
55 fn from(n: $ty) -> Self {
56 Value::Number(Number::Float64(n as f64))
57 }
58 }
59 )*
60 };
61}
62
63from_signed_integer! {
64 i8 i16 i32 i64 isize
65}
66
67from_unsigned_integer! {
68 u8 u16 u32 u64 usize
69}
70
71from_float! {
72 f32 f64
73}
74
75impl<'a> From<OrderedFloat<f32>> for Value<'a> {
76 fn from(f: OrderedFloat<f32>) -> Self {
77 Value::Number(Number::Float64(f.0 as f64))
78 }
79}
80
81impl<'a> From<OrderedFloat<f64>> for Value<'a> {
82 fn from(f: OrderedFloat<f64>) -> Self {
83 Value::Number(Number::Float64(f.0))
84 }
85}
86
87impl<'a> From<bool> for Value<'a> {
88 fn from(f: bool) -> Self {
89 Value::Bool(f)
90 }
91}
92
93impl<'a> From<String> for Value<'a> {
94 fn from(f: String) -> Self {
95 Value::String(f.into())
96 }
97}
98
99impl<'a> From<&'a str> for Value<'a> {
100 fn from(f: &'a str) -> Self {
101 Value::String(Cow::from(f))
102 }
103}
104
105impl<'a> From<Cow<'a, str>> for Value<'a> {
106 fn from(f: Cow<'a, str>) -> Self {
107 Value::String(f)
108 }
109}
110
111impl<'a> From<Object<'a>> for Value<'a> {
112 fn from(o: Object<'a>) -> Self {
113 Value::Object(o)
114 }
115}
116
117impl<'a, T: Into<Value<'a>>> From<Vec<T>> for Value<'a> {
118 fn from(f: Vec<T>) -> Self {
119 Value::Array(f.into_iter().map(Into::into).collect())
120 }
121}
122
123impl<'a, T: Clone + Into<Value<'a>>> From<&'a [T]> for Value<'a> {
124 fn from(f: &'a [T]) -> Self {
125 Value::Array(f.iter().cloned().map(Into::into).collect())
126 }
127}
128
129impl<'a, T: Into<Value<'a>>> FromIterator<T> for Value<'a> {
130 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
131 Value::Array(iter.into_iter().map(Into::into).collect())
132 }
133}
134
135impl<'a, K: Into<String>, V: Into<Value<'a>>> FromIterator<(K, V)> for Value<'a> {
136 fn from_iter<I: IntoIterator<Item = (K, V)>>(iter: I) -> Self {
137 Value::Object(
138 iter.into_iter()
139 .map(|(k, v)| (k.into(), v.into()))
140 .collect(),
141 )
142 }
143}
144
145impl<'a> From<()> for Value<'a> {
146 fn from((): ()) -> Self {
147 Value::Null
148 }
149}
150
151impl<'a> From<&JsonValue> for Value<'a> {
152 fn from(value: &JsonValue) -> Self {
153 match value {
154 JsonValue::Null => Value::Null,
155 JsonValue::Bool(v) => Value::Bool(*v),
156 JsonValue::Number(v) => {
157 if v.is_u64() {
158 Value::Number(Number::UInt64(v.as_u64().unwrap()))
159 } else if v.is_i64() {
160 Value::Number(Number::Int64(v.as_i64().unwrap()))
161 } else {
162 Value::Number(Number::Float64(v.as_f64().unwrap()))
163 }
164 }
165 JsonValue::String(v) => Value::String(v.clone().into()),
166 JsonValue::Array(arr) => {
167 let mut vals: Vec<Value> = Vec::with_capacity(arr.len());
168 for val in arr {
169 vals.push(val.into());
170 }
171 Value::Array(vals)
172 }
173 JsonValue::Object(obj) => {
174 let mut map = Object::new();
175 for (k, v) in obj.iter() {
176 let val: Value = v.into();
177 map.insert(k.to_string(), val);
178 }
179 Value::Object(map)
180 }
181 }
182 }
183}
184
185impl<'a> From<Value<'a>> for JsonValue {
186 fn from(value: Value<'a>) -> Self {
187 match value {
188 Value::Null => JsonValue::Null,
189 Value::Bool(v) => JsonValue::Bool(v),
190 Value::Number(v) => match v {
191 Number::Int64(v) => JsonValue::Number(v.into()),
192 Number::UInt64(v) => JsonValue::Number(v.into()),
193 Number::Float64(v) => JsonValue::Number(JsonNumber::from_f64(v).unwrap()),
194 },
195 Value::String(v) => JsonValue::String(v.to_string()),
196 Value::Array(arr) => {
197 let mut vals: Vec<JsonValue> = Vec::with_capacity(arr.len());
198 for val in arr {
199 vals.push(val.into());
200 }
201 JsonValue::Array(vals)
202 }
203 Value::Object(obj) => {
204 let mut map = JsonMap::new();
205 for (k, v) in obj.iter() {
206 let val: JsonValue = v.clone().into();
207 map.insert(k.to_string(), val);
208 }
209 JsonValue::Object(map)
210 }
211 }
212 }
213}