Skip to main content

qubit_value/multi_values/
multi_values_converters.rs

1use qubit_common::lang::DataType;
2
3use crate::Value;
4use crate::error::{ValueError, ValueResult};
5
6use super::multi_values_core::MultiValues;
7
8impl MultiValues {
9    /// Convert to a single [`Value`] by taking the first element.
10    ///
11    /// If there is no element, returns `Value::Empty(self.data_type())`.
12    ///
13    /// # Returns
14    ///
15    /// Returns the first element wrapped as [`Value`], or an empty value
16    /// preserving the current data type.
17    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    /// Merge another multiple values
159    ///
160    /// Append all values from another multiple values to the current multiple values
161    ///
162    /// # Parameters
163    ///
164    /// * `other` - The multiple values to merge
165    ///
166    /// # Returns
167    ///
168    /// If types match, returns `Ok(())`; otherwise returns an error
169    ///
170    /// # Example
171    ///
172    /// ```rust
173    /// use qubit_value::MultiValues;
174    ///
175    /// let mut a = MultiValues::Int32(vec![1, 2]);
176    /// let b = MultiValues::Int32(vec![3, 4]);
177    /// a.merge(&b).unwrap();
178    /// assert_eq!(a.get_int32s().unwrap(), &[1, 2, 3, 4]);
179    /// ```
180    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}