qubit_value/multi_values/
multi_values_multi_adder.rs1use crate::value_error::{
14 ValueError,
15 ValueResult,
16};
17use std::collections::HashMap;
18use std::time::Duration;
19
20use bigdecimal::BigDecimal;
21use chrono::{
22 DateTime,
23 NaiveDate,
24 NaiveDateTime,
25 NaiveTime,
26 Utc,
27};
28use num_bigint::BigInt;
29use url::Url;
30
31use qubit_datatype::DataType;
32
33use super::multi_values::MultiValues;
34
35pub trait MultiValuesMultiAdder<T>: super::sealed::MultiValuesMultiAdderSealed<T> {
40 fn add_values(&mut self, values: Vec<T>) -> ValueResult<()>;
47}
48
49macro_rules! impl_multi_values_multi_adder {
50 ($type:ty, $variant:ident, $data_type:expr) => {
51 impl super::sealed::MultiValuesMultiAdderSealed<$type> for MultiValues {}
52
53 impl MultiValuesMultiAdder<$type> for MultiValues {
54 #[inline]
55 fn add_values(&mut self, values: Vec<$type>) -> ValueResult<()> {
56 match self {
57 MultiValues::$variant(v) => {
58 v.extend(values);
59 Ok(())
60 }
61 MultiValues::Empty(dt) if *dt == $data_type => {
62 *self = MultiValues::$variant(values);
63 Ok(())
64 }
65 _ => Err(ValueError::TypeMismatch {
66 expected: $data_type,
67 actual: self.data_type(),
68 }),
69 }
70 }
71 }
72 };
73}
74
75impl_multi_values_multi_adder!(bool, Bool, DataType::Bool);
76impl_multi_values_multi_adder!(char, Char, DataType::Char);
77impl_multi_values_multi_adder!(i8, Int8, DataType::Int8);
78impl_multi_values_multi_adder!(i16, Int16, DataType::Int16);
79impl_multi_values_multi_adder!(i32, Int32, DataType::Int32);
80impl_multi_values_multi_adder!(i64, Int64, DataType::Int64);
81impl_multi_values_multi_adder!(i128, Int128, DataType::Int128);
82impl_multi_values_multi_adder!(u8, UInt8, DataType::UInt8);
83impl_multi_values_multi_adder!(u16, UInt16, DataType::UInt16);
84impl_multi_values_multi_adder!(u32, UInt32, DataType::UInt32);
85impl_multi_values_multi_adder!(u64, UInt64, DataType::UInt64);
86impl_multi_values_multi_adder!(u128, UInt128, DataType::UInt128);
87impl_multi_values_multi_adder!(isize, IntSize, DataType::IntSize);
88impl_multi_values_multi_adder!(usize, UIntSize, DataType::UIntSize);
89impl_multi_values_multi_adder!(f32, Float32, DataType::Float32);
90impl_multi_values_multi_adder!(f64, Float64, DataType::Float64);
91impl_multi_values_multi_adder!(String, String, DataType::String);
92impl_multi_values_multi_adder!(NaiveDate, Date, DataType::Date);
93impl_multi_values_multi_adder!(NaiveTime, Time, DataType::Time);
94impl_multi_values_multi_adder!(NaiveDateTime, DateTime, DataType::DateTime);
95impl_multi_values_multi_adder!(DateTime<Utc>, Instant, DataType::Instant);
96impl_multi_values_multi_adder!(BigInt, BigInteger, DataType::BigInteger);
97impl_multi_values_multi_adder!(BigDecimal, BigDecimal, DataType::BigDecimal);
98impl_multi_values_multi_adder!(Duration, Duration, DataType::Duration);
99impl_multi_values_multi_adder!(Url, Url, DataType::Url);
100impl_multi_values_multi_adder!(HashMap<String, String>, StringMap, DataType::StringMap);
101impl_multi_values_multi_adder!(serde_json::Value, Json, DataType::Json);