Skip to main content

qubit_value/multi_values/
multi_values_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 one `MultiValues` element.
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/// Internal trait used to add a single value to `MultiValues`.
36///
37/// This trait backs `MultiValues::add<S>()`; downstream code should call the
38/// inherent method instead of implementing or naming this trait directly.
39pub trait MultiValuesAdder<T>: super::sealed::MultiValuesAdderSealed<T> {
40    /// Appends `value` to the stored values.
41    ///
42    /// # Returns
43    ///
44    /// Returns `Ok(())` when the value can be appended, or a `ValueError`
45    /// describing the type mismatch.
46    fn add_value(&mut self, value: T) -> ValueResult<()>;
47}
48
49macro_rules! impl_multi_values_adder {
50    ($type:ty, $variant:ident, $data_type:expr) => {
51        impl super::sealed::MultiValuesAdderSealed<$type> for MultiValues {}
52
53        impl MultiValuesAdder<$type> for MultiValues {
54            #[inline]
55            fn add_value(&mut self, value: $type) -> ValueResult<()> {
56                match self {
57                    MultiValues::$variant(v) => {
58                        v.push(value);
59                        Ok(())
60                    }
61                    MultiValues::Empty(dt) if *dt == $data_type => {
62                        *self = MultiValues::$variant(vec![value]);
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_adder!(bool, Bool, DataType::Bool);
76impl_multi_values_adder!(char, Char, DataType::Char);
77impl_multi_values_adder!(i8, Int8, DataType::Int8);
78impl_multi_values_adder!(i16, Int16, DataType::Int16);
79impl_multi_values_adder!(i32, Int32, DataType::Int32);
80impl_multi_values_adder!(i64, Int64, DataType::Int64);
81impl_multi_values_adder!(i128, Int128, DataType::Int128);
82impl_multi_values_adder!(u8, UInt8, DataType::UInt8);
83impl_multi_values_adder!(u16, UInt16, DataType::UInt16);
84impl_multi_values_adder!(u32, UInt32, DataType::UInt32);
85impl_multi_values_adder!(u64, UInt64, DataType::UInt64);
86impl_multi_values_adder!(u128, UInt128, DataType::UInt128);
87impl_multi_values_adder!(isize, IntSize, DataType::IntSize);
88impl_multi_values_adder!(usize, UIntSize, DataType::UIntSize);
89impl_multi_values_adder!(f32, Float32, DataType::Float32);
90impl_multi_values_adder!(f64, Float64, DataType::Float64);
91impl_multi_values_adder!(String, String, DataType::String);
92impl_multi_values_adder!(NaiveDate, Date, DataType::Date);
93impl_multi_values_adder!(NaiveTime, Time, DataType::Time);
94impl_multi_values_adder!(NaiveDateTime, DateTime, DataType::DateTime);
95impl_multi_values_adder!(DateTime<Utc>, Instant, DataType::Instant);
96impl_multi_values_adder!(BigInt, BigInteger, DataType::BigInteger);
97impl_multi_values_adder!(BigDecimal, BigDecimal, DataType::BigDecimal);
98impl_multi_values_adder!(Duration, Duration, DataType::Duration);
99impl_multi_values_adder!(Url, Url, DataType::Url);
100impl_multi_values_adder!(HashMap<String, String>, StringMap, DataType::StringMap);
101impl_multi_values_adder!(serde_json::Value, Json, DataType::Json);