generic_core/
into.rs

1use std::collections::{
2    HashMap,
3    HashSet,
4    BTreeMap,
5    BTreeSet,
6};
7use crate::value::{
8    Value,
9    Collection,
10    Numeric,
11};
12
13///////////////////////////////////////////////////////////////////////////////
14// GENERIC INTERFACE
15///////////////////////////////////////////////////////////////////////////////
16
17pub trait IntoGeneric where Self: Sized {
18    fn into_generic(&self) -> Value;
19}
20
21
22///////////////////////////////////////////////////////////////////////////////
23// BASIC IMPLEMENTATIONS - MISC
24///////////////////////////////////////////////////////////////////////////////
25
26impl IntoGeneric for uuid::Uuid {
27    fn into_generic(&self) -> Value {
28        Value::String(self.to_string())
29    }
30}
31
32
33///////////////////////////////////////////////////////////////////////////////
34// BASIC IMPLEMENTATIONS - STD
35///////////////////////////////////////////////////////////////////////////////
36
37impl 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
98// impl IntoGeneric for usize {
99//     fn into_generic(&self) -> Value {
100//         Value::Numeric(unimplemented!())
101//     }
102// }
103// impl IntoGeneric for isize {
104//     fn into_generic(&self) -> Value {
105//         Value::Numeric(unimplemented!())
106//     }
107// }
108
109impl 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
157///////////////////////////////////////////////////////////////////////////////
158// BASIC IMPLEMENTATIONS - TUPLES
159///////////////////////////////////////////////////////////////////////////////
160
161impl<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}