Skip to main content

qubit_value/multi_values/
multi_values_multi_adder.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2025 - 2026 Haixing Hu.
4 *
5 *    SPDX-License-Identifier: Apache-2.0
6 *
7 *    Licensed under the Apache License, Version 2.0.
8 *
9 ******************************************************************************/
10
11//! Internal implementations for appending multiple `MultiValues` elements from `Vec`.
12
13use 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
35/// Private marker trait used to prevent downstream implementations.
36trait MultiValuesMultiAdderSealed<T> {}
37
38/// Internal trait used to add multiple values to `MultiValues`.
39///
40/// This trait backs `MultiValues::add<S>()`; downstream code should call the
41/// inherent method instead of implementing or naming this trait directly.
42#[allow(private_bounds)]
43pub trait MultiValuesMultiAdder<T>: MultiValuesMultiAdderSealed<T> {
44    /// Appends all values from `values`.
45    ///
46    /// # Returns
47    ///
48    /// Returns `Ok(())` when the values can be appended, or a `ValueError`
49    /// describing the type mismatch.
50    fn add_values(&mut self, values: Vec<T>) -> ValueResult<()>;
51}
52
53macro_rules! impl_multi_values_multi_adder {
54    ($type:ty, $variant:ident, $data_type:expr) => {
55        impl MultiValuesMultiAdderSealed<$type> for MultiValues {}
56
57        impl MultiValuesMultiAdder<$type> for MultiValues {
58            #[inline]
59            fn add_values(&mut self, values: Vec<$type>) -> ValueResult<()> {
60                match self {
61                    MultiValues::$variant(v) => {
62                        v.extend(values);
63                        Ok(())
64                    }
65                    MultiValues::Empty(dt) if *dt == $data_type => {
66                        *self = MultiValues::$variant(values);
67                        Ok(())
68                    }
69                    _ => Err(ValueError::TypeMismatch {
70                        expected: $data_type,
71                        actual: self.data_type(),
72                    }),
73                }
74            }
75        }
76    };
77}
78
79impl_multi_values_multi_adder!(bool, Bool, DataType::Bool);
80impl_multi_values_multi_adder!(char, Char, DataType::Char);
81impl_multi_values_multi_adder!(i8, Int8, DataType::Int8);
82impl_multi_values_multi_adder!(i16, Int16, DataType::Int16);
83impl_multi_values_multi_adder!(i32, Int32, DataType::Int32);
84impl_multi_values_multi_adder!(i64, Int64, DataType::Int64);
85impl_multi_values_multi_adder!(i128, Int128, DataType::Int128);
86impl_multi_values_multi_adder!(u8, UInt8, DataType::UInt8);
87impl_multi_values_multi_adder!(u16, UInt16, DataType::UInt16);
88impl_multi_values_multi_adder!(u32, UInt32, DataType::UInt32);
89impl_multi_values_multi_adder!(u64, UInt64, DataType::UInt64);
90impl_multi_values_multi_adder!(u128, UInt128, DataType::UInt128);
91impl_multi_values_multi_adder!(isize, IntSize, DataType::IntSize);
92impl_multi_values_multi_adder!(usize, UIntSize, DataType::UIntSize);
93impl_multi_values_multi_adder!(f32, Float32, DataType::Float32);
94impl_multi_values_multi_adder!(f64, Float64, DataType::Float64);
95impl_multi_values_multi_adder!(String, String, DataType::String);
96impl_multi_values_multi_adder!(NaiveDate, Date, DataType::Date);
97impl_multi_values_multi_adder!(NaiveTime, Time, DataType::Time);
98impl_multi_values_multi_adder!(NaiveDateTime, DateTime, DataType::DateTime);
99impl_multi_values_multi_adder!(DateTime<Utc>, Instant, DataType::Instant);
100impl_multi_values_multi_adder!(BigInt, BigInteger, DataType::BigInteger);
101impl_multi_values_multi_adder!(BigDecimal, BigDecimal, DataType::BigDecimal);
102impl_multi_values_multi_adder!(Duration, Duration, DataType::Duration);
103impl_multi_values_multi_adder!(Url, Url, DataType::Url);
104impl_multi_values_multi_adder!(HashMap<String, String>, StringMap, DataType::StringMap);
105impl_multi_values_multi_adder!(serde_json::Value, Json, DataType::Json);