1use std::collections::{
2 HashMap,
3 HashSet,
4 BTreeMap,
5 BTreeSet,
6};
7use crate::value::{
8 Value,
9 Collection,
10 Numeric,
11};
12
13pub trait IntoGeneric where Self: Sized {
18 fn into_generic(&self) -> Value;
19}
20
21
22impl IntoGeneric for uuid::Uuid {
27 fn into_generic(&self) -> Value {
28 Value::String(self.to_string())
29 }
30}
31
32
33impl IntoGeneric for f32 {
38 fn into_generic(&self) -> Value {
39 Value::Numeric(Numeric::F64(*self as f64))
40 }
41}
42impl IntoGeneric for f64 {
43 fn into_generic(&self) -> Value {
44 Value::Numeric(Numeric::F64(*self))
45 }
46}
47impl IntoGeneric for i8 {
48 fn into_generic(&self) -> Value {
49 Value::Numeric(Numeric::I64(*self as i64))
50 }
51}
52impl IntoGeneric for i16 {
53 fn into_generic(&self) -> Value {
54 Value::Numeric(Numeric::I64(*self as i64))
55 }
56}
57impl IntoGeneric for i32 {
58 fn into_generic(&self) -> Value {
59 Value::Numeric(Numeric::I64(*self as i64))
60 }
61}
62impl IntoGeneric for i64 {
63 fn into_generic(&self) -> Value {
64 Value::Numeric(Numeric::I64(*self))
65 }
66}
67impl IntoGeneric for i128 {
68 fn into_generic(&self) -> Value {
69 Value::Numeric(Numeric::I128(*self))
70 }
71}
72impl IntoGeneric for u8 {
73 fn into_generic(&self) -> Value {
74 Value::Numeric(Numeric::U64(*self as u64))
75 }
76}
77impl IntoGeneric for u16 {
78 fn into_generic(&self) -> Value {
79 Value::Numeric(Numeric::U64(*self as u64))
80 }
81}
82impl IntoGeneric for u32 {
83 fn into_generic(&self) -> Value {
84 Value::Numeric(Numeric::U64(*self as u64))
85 }
86}
87impl IntoGeneric for u64 {
88 fn into_generic(&self) -> Value {
89 Value::Numeric(Numeric::U64(*self))
90 }
91}
92impl IntoGeneric for u128 {
93 fn into_generic(&self) -> Value {
94 Value::Numeric(Numeric::U128(*self))
95 }
96}
97
98impl IntoGeneric for () {
110 fn into_generic(&self) -> Value {
111 Value::Unit
112 }
113}
114
115impl IntoGeneric for bool {
116 fn into_generic(&self) -> Value {
117 Value::Bool(*self)
118 }
119}
120
121impl IntoGeneric for char {
122 fn into_generic(&self) -> Value {
123 let mut x = String::new();
124 x.push(*self);
125 Value::String(x)
126 }
127}
128
129impl IntoGeneric for String {
130 fn into_generic(&self) -> Value {
131 Value::String(self.clone())
132 }
133}
134
135impl<V: IntoGeneric> IntoGeneric for Vec<V> {
136 fn into_generic(&self) -> Value {
137 let xs = self
138 .iter()
139 .map(|(v)| v.into_generic())
140 .collect::<Vec<_>>();
141 Value::Collection(Collection::Vec(xs))
142 }
143}
144
145
146impl<V: IntoGeneric> IntoGeneric for HashMap<String, V> {
147 fn into_generic(&self) -> Value {
148 let xs = self
149 .iter()
150 .map(|(k, v)| (k.clone(), v.into_generic()))
151 .collect::<HashMap<String, Value>>();
152 Value::Collection(Collection::Map(xs))
153 }
154}
155
156
157impl<T1, T2> IntoGeneric for (T1, T2)
162where
163 T1: IntoGeneric,
164 T2: IntoGeneric,
165{
166 fn into_generic(&self) -> Value {
167 Value::Tuple(vec![
168 self.0.into_generic(),
169 self.1.into_generic(),
170 ])
171 }
172}
173
174impl<T1, T2, T3> IntoGeneric for (T1, T2, T3)
175where
176 T1: IntoGeneric,
177 T2: IntoGeneric,
178 T3: IntoGeneric,
179{
180 fn into_generic(&self) -> Value {
181 Value::Tuple(vec![
182 self.0.into_generic(),
183 self.1.into_generic(),
184 self.2.into_generic(),
185 ])
186 }
187}
188
189impl<T1, T2, T3, T4> IntoGeneric for (T1, T2, T3, T4)
190where
191 T1: IntoGeneric,
192 T2: IntoGeneric,
193 T3: IntoGeneric,
194 T4: IntoGeneric,
195{
196 fn into_generic(&self) -> Value {
197 Value::Tuple(vec![
198 self.0.into_generic(),
199 self.1.into_generic(),
200 self.2.into_generic(),
201 self.3.into_generic(),
202 ])
203 }
204}