qubit_value/multi_values/
multi_values_converters.rs1use qubit_common::lang::DataType;
2
3use crate::Value;
4use crate::error::{ValueError, ValueResult};
5
6use super::multi_values_core::MultiValues;
7
8impl MultiValues {
9 pub fn to_value(&self) -> Value {
18 match self {
19 MultiValues::Empty(dt) => Value::Empty(*dt),
20 MultiValues::Bool(v) => v
21 .first()
22 .copied()
23 .map(Value::Bool)
24 .unwrap_or(Value::Empty(DataType::Bool)),
25 MultiValues::Char(v) => v
26 .first()
27 .copied()
28 .map(Value::Char)
29 .unwrap_or(Value::Empty(DataType::Char)),
30 MultiValues::Int8(v) => v
31 .first()
32 .copied()
33 .map(Value::Int8)
34 .unwrap_or(Value::Empty(DataType::Int8)),
35 MultiValues::Int16(v) => v
36 .first()
37 .copied()
38 .map(Value::Int16)
39 .unwrap_or(Value::Empty(DataType::Int16)),
40 MultiValues::Int32(v) => v
41 .first()
42 .copied()
43 .map(Value::Int32)
44 .unwrap_or(Value::Empty(DataType::Int32)),
45 MultiValues::Int64(v) => v
46 .first()
47 .copied()
48 .map(Value::Int64)
49 .unwrap_or(Value::Empty(DataType::Int64)),
50 MultiValues::Int128(v) => v
51 .first()
52 .copied()
53 .map(Value::Int128)
54 .unwrap_or(Value::Empty(DataType::Int128)),
55 MultiValues::UInt8(v) => v
56 .first()
57 .copied()
58 .map(Value::UInt8)
59 .unwrap_or(Value::Empty(DataType::UInt8)),
60 MultiValues::UInt16(v) => v
61 .first()
62 .copied()
63 .map(Value::UInt16)
64 .unwrap_or(Value::Empty(DataType::UInt16)),
65 MultiValues::UInt32(v) => v
66 .first()
67 .copied()
68 .map(Value::UInt32)
69 .unwrap_or(Value::Empty(DataType::UInt32)),
70 MultiValues::UInt64(v) => v
71 .first()
72 .copied()
73 .map(Value::UInt64)
74 .unwrap_or(Value::Empty(DataType::UInt64)),
75 MultiValues::UInt128(v) => v
76 .first()
77 .copied()
78 .map(Value::UInt128)
79 .unwrap_or(Value::Empty(DataType::UInt128)),
80 MultiValues::IntSize(v) => v
81 .first()
82 .copied()
83 .map(Value::IntSize)
84 .unwrap_or(Value::Empty(DataType::IntSize)),
85 MultiValues::UIntSize(v) => v
86 .first()
87 .copied()
88 .map(Value::UIntSize)
89 .unwrap_or(Value::Empty(DataType::UIntSize)),
90 MultiValues::Float32(v) => v
91 .first()
92 .copied()
93 .map(Value::Float32)
94 .unwrap_or(Value::Empty(DataType::Float32)),
95 MultiValues::Float64(v) => v
96 .first()
97 .copied()
98 .map(Value::Float64)
99 .unwrap_or(Value::Empty(DataType::Float64)),
100 MultiValues::BigInteger(v) => v
101 .first()
102 .cloned()
103 .map(Value::BigInteger)
104 .unwrap_or(Value::Empty(DataType::BigInteger)),
105 MultiValues::BigDecimal(v) => v
106 .first()
107 .cloned()
108 .map(Value::BigDecimal)
109 .unwrap_or(Value::Empty(DataType::BigDecimal)),
110 MultiValues::String(v) => v
111 .first()
112 .cloned()
113 .map(Value::String)
114 .unwrap_or(Value::Empty(DataType::String)),
115 MultiValues::Date(v) => v
116 .first()
117 .copied()
118 .map(Value::Date)
119 .unwrap_or(Value::Empty(DataType::Date)),
120 MultiValues::Time(v) => v
121 .first()
122 .copied()
123 .map(Value::Time)
124 .unwrap_or(Value::Empty(DataType::Time)),
125 MultiValues::DateTime(v) => v
126 .first()
127 .copied()
128 .map(Value::DateTime)
129 .unwrap_or(Value::Empty(DataType::DateTime)),
130 MultiValues::Instant(v) => v
131 .first()
132 .copied()
133 .map(Value::Instant)
134 .unwrap_or(Value::Empty(DataType::Instant)),
135 MultiValues::Duration(v) => v
136 .first()
137 .copied()
138 .map(Value::Duration)
139 .unwrap_or(Value::Empty(DataType::Duration)),
140 MultiValues::Url(v) => v
141 .first()
142 .cloned()
143 .map(Value::Url)
144 .unwrap_or(Value::Empty(DataType::Url)),
145 MultiValues::StringMap(v) => v
146 .first()
147 .cloned()
148 .map(Value::StringMap)
149 .unwrap_or(Value::Empty(DataType::StringMap)),
150 MultiValues::Json(v) => v
151 .first()
152 .cloned()
153 .map(Value::Json)
154 .unwrap_or(Value::Empty(DataType::Json)),
155 }
156 }
157
158 pub fn merge(&mut self, other: &MultiValues) -> ValueResult<()> {
181 if self.data_type() != other.data_type() {
182 return Err(ValueError::TypeMismatch {
183 expected: self.data_type(),
184 actual: other.data_type(),
185 });
186 }
187
188 match (self, other) {
189 (MultiValues::Bool(v), MultiValues::Bool(o)) => v.extend_from_slice(o),
190 (MultiValues::Char(v), MultiValues::Char(o)) => v.extend_from_slice(o),
191 (MultiValues::Int8(v), MultiValues::Int8(o)) => v.extend_from_slice(o),
192 (MultiValues::Int16(v), MultiValues::Int16(o)) => v.extend_from_slice(o),
193 (MultiValues::Int32(v), MultiValues::Int32(o)) => v.extend_from_slice(o),
194 (MultiValues::Int64(v), MultiValues::Int64(o)) => v.extend_from_slice(o),
195 (MultiValues::Int128(v), MultiValues::Int128(o)) => v.extend_from_slice(o),
196 (MultiValues::UInt8(v), MultiValues::UInt8(o)) => v.extend_from_slice(o),
197 (MultiValues::UInt16(v), MultiValues::UInt16(o)) => v.extend_from_slice(o),
198 (MultiValues::UInt32(v), MultiValues::UInt32(o)) => v.extend_from_slice(o),
199 (MultiValues::UInt64(v), MultiValues::UInt64(o)) => v.extend_from_slice(o),
200 (MultiValues::UInt128(v), MultiValues::UInt128(o)) => v.extend_from_slice(o),
201 (MultiValues::Float32(v), MultiValues::Float32(o)) => v.extend_from_slice(o),
202 (MultiValues::Float64(v), MultiValues::Float64(o)) => v.extend_from_slice(o),
203 (MultiValues::String(v), MultiValues::String(o)) => v.extend_from_slice(o),
204 (MultiValues::Date(v), MultiValues::Date(o)) => v.extend_from_slice(o),
205 (MultiValues::Time(v), MultiValues::Time(o)) => v.extend_from_slice(o),
206 (MultiValues::DateTime(v), MultiValues::DateTime(o)) => v.extend_from_slice(o),
207 (MultiValues::Instant(v), MultiValues::Instant(o)) => v.extend_from_slice(o),
208 (MultiValues::BigInteger(v), MultiValues::BigInteger(o)) => v.extend_from_slice(o),
209 (MultiValues::BigDecimal(v), MultiValues::BigDecimal(o)) => v.extend_from_slice(o),
210 (MultiValues::IntSize(v), MultiValues::IntSize(o)) => v.extend_from_slice(o),
211 (MultiValues::UIntSize(v), MultiValues::UIntSize(o)) => v.extend_from_slice(o),
212 (MultiValues::Duration(v), MultiValues::Duration(o)) => v.extend_from_slice(o),
213 (MultiValues::Url(v), MultiValues::Url(o)) => v.extend_from_slice(o),
214 (MultiValues::StringMap(v), MultiValues::StringMap(o)) => v.extend(o.iter().cloned()),
215 (MultiValues::Json(v), MultiValues::Json(o)) => v.extend(o.iter().cloned()),
216 (slot @ MultiValues::Empty(_), other_values) => *slot = other_values.clone(),
217 _ => unreachable!(),
218 }
219
220 Ok(())
221 }
222}
223
224impl Default for MultiValues {
225 #[inline]
226 fn default() -> Self {
227 MultiValues::Empty(DataType::String)
228 }
229}
230
231impl From<Value> for MultiValues {
232 fn from(value: Value) -> Self {
233 match value {
234 Value::Empty(dt) => MultiValues::Empty(dt),
235 Value::Bool(v) => MultiValues::Bool(vec![v]),
236 Value::Char(v) => MultiValues::Char(vec![v]),
237 Value::Int8(v) => MultiValues::Int8(vec![v]),
238 Value::Int16(v) => MultiValues::Int16(vec![v]),
239 Value::Int32(v) => MultiValues::Int32(vec![v]),
240 Value::Int64(v) => MultiValues::Int64(vec![v]),
241 Value::Int128(v) => MultiValues::Int128(vec![v]),
242 Value::UInt8(v) => MultiValues::UInt8(vec![v]),
243 Value::UInt16(v) => MultiValues::UInt16(vec![v]),
244 Value::UInt32(v) => MultiValues::UInt32(vec![v]),
245 Value::UInt64(v) => MultiValues::UInt64(vec![v]),
246 Value::UInt128(v) => MultiValues::UInt128(vec![v]),
247 Value::Float32(v) => MultiValues::Float32(vec![v]),
248 Value::Float64(v) => MultiValues::Float64(vec![v]),
249 Value::String(v) => MultiValues::String(vec![v]),
250 Value::Date(v) => MultiValues::Date(vec![v]),
251 Value::Time(v) => MultiValues::Time(vec![v]),
252 Value::DateTime(v) => MultiValues::DateTime(vec![v]),
253 Value::Instant(v) => MultiValues::Instant(vec![v]),
254 Value::BigInteger(v) => MultiValues::BigInteger(vec![v]),
255 Value::BigDecimal(v) => MultiValues::BigDecimal(vec![v]),
256 Value::IntSize(v) => MultiValues::IntSize(vec![v]),
257 Value::UIntSize(v) => MultiValues::UIntSize(vec![v]),
258 Value::Duration(v) => MultiValues::Duration(vec![v]),
259 Value::Url(v) => MultiValues::Url(vec![v]),
260 Value::StringMap(v) => MultiValues::StringMap(vec![v]),
261 Value::Json(v) => MultiValues::Json(vec![v]),
262 }
263 }
264}