Skip to main content

qubit_value/multi_values/
multi_values_add_arg.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 dispatch implementations for `MultiValues::add<S>()` arguments.
12
13use super::multi_values::MultiValues;
14use crate::value_error::ValueResult;
15use std::collections::HashMap;
16use std::time::Duration;
17
18use bigdecimal::BigDecimal;
19use chrono::{
20    DateTime,
21    NaiveDate,
22    NaiveDateTime,
23    NaiveTime,
24    Utc,
25};
26use num_bigint::BigInt;
27use url::Url;
28
29use super::multi_values_adder::MultiValuesAdder;
30use super::multi_values_multi_adder::MultiValuesMultiAdder;
31use super::multi_values_multi_adder_slice::MultiValuesMultiAdderSlice;
32
33/// Private marker trait used to prevent downstream implementations.
34trait MultiValuesAddArgSealed {}
35
36/// Internal dispatch trait for `MultiValues::add<S>()`.
37///
38/// Implementations route `T`, `Vec<T>`, and `&[T]` to the matching add path.
39#[allow(private_bounds)]
40pub trait MultiValuesAddArg<'a>: MultiValuesAddArgSealed {
41    /// Element type being added.
42    type Item: 'a + Clone;
43
44    /// Applies this add argument to `target`.
45    ///
46    /// # Returns
47    ///
48    /// Returns `Ok(())` when the target is updated, or a `ValueError` from the
49    /// selected add path.
50    fn apply_add(self, target: &mut MultiValues) -> ValueResult<()>;
51}
52
53macro_rules! impl_multi_values_add_arg {
54    ($type:ty) => {
55        impl MultiValuesAddArgSealed for $type {}
56
57        impl<'a> MultiValuesAddArg<'a> for $type {
58            type Item = $type;
59
60            #[inline]
61            fn apply_add(self, target: &mut MultiValues) -> ValueResult<()> {
62                <MultiValues as MultiValuesAdder<$type>>::add_value(target, self)
63            }
64        }
65
66        impl MultiValuesAddArgSealed for Vec<$type> {}
67
68        impl<'a> MultiValuesAddArg<'a> for Vec<$type> {
69            type Item = $type;
70
71            #[inline]
72            fn apply_add(self, target: &mut MultiValues) -> ValueResult<()> {
73                <MultiValues as MultiValuesMultiAdder<$type>>::add_values(target, self)
74            }
75        }
76
77        impl<'a> MultiValuesAddArgSealed for &'a [$type] {}
78
79        impl<'a> MultiValuesAddArg<'a> for &'a [$type]
80        where
81            $type: Clone,
82        {
83            type Item = $type;
84
85            #[inline]
86            fn apply_add(self, target: &mut MultiValues) -> ValueResult<()> {
87                <MultiValues as MultiValuesMultiAdderSlice<$type>>::add_values_slice(target, self)
88            }
89        }
90
91        impl<'a> MultiValuesAddArgSealed for &'a Vec<$type> {}
92
93        impl<'a> MultiValuesAddArg<'a> for &'a Vec<$type>
94        where
95            $type: Clone,
96        {
97            type Item = $type;
98
99            #[inline]
100            fn apply_add(self, target: &mut MultiValues) -> ValueResult<()> {
101                <MultiValues as MultiValuesMultiAdderSlice<$type>>::add_values_slice(
102                    target,
103                    self.as_slice(),
104                )
105            }
106        }
107
108        impl<const N: usize> MultiValuesAddArgSealed for [$type; N] {}
109
110        impl<'a, const N: usize> MultiValuesAddArg<'a> for [$type; N] {
111            type Item = $type;
112
113            #[inline]
114            fn apply_add(self, target: &mut MultiValues) -> ValueResult<()> {
115                <MultiValues as MultiValuesMultiAdder<$type>>::add_values(target, Vec::from(self))
116            }
117        }
118
119        impl<'a, const N: usize> MultiValuesAddArgSealed for &'a [$type; N] {}
120
121        impl<'a, const N: usize> MultiValuesAddArg<'a> for &'a [$type; N]
122        where
123            $type: Clone,
124        {
125            type Item = $type;
126
127            #[inline]
128            fn apply_add(self, target: &mut MultiValues) -> ValueResult<()> {
129                <MultiValues as MultiValuesMultiAdderSlice<$type>>::add_values_slice(
130                    target,
131                    self.as_slice(),
132                )
133            }
134        }
135    };
136}
137
138impl_multi_values_add_arg!(bool);
139impl_multi_values_add_arg!(char);
140impl_multi_values_add_arg!(i8);
141impl_multi_values_add_arg!(i16);
142impl_multi_values_add_arg!(i32);
143impl_multi_values_add_arg!(i64);
144impl_multi_values_add_arg!(i128);
145impl_multi_values_add_arg!(u8);
146impl_multi_values_add_arg!(u16);
147impl_multi_values_add_arg!(u32);
148impl_multi_values_add_arg!(u64);
149impl_multi_values_add_arg!(u128);
150impl_multi_values_add_arg!(isize);
151impl_multi_values_add_arg!(usize);
152impl_multi_values_add_arg!(f32);
153impl_multi_values_add_arg!(f64);
154impl_multi_values_add_arg!(String);
155impl_multi_values_add_arg!(NaiveDate);
156impl_multi_values_add_arg!(NaiveTime);
157impl_multi_values_add_arg!(NaiveDateTime);
158impl_multi_values_add_arg!(DateTime<Utc>);
159impl_multi_values_add_arg!(BigInt);
160impl_multi_values_add_arg!(BigDecimal);
161impl_multi_values_add_arg!(Duration);
162impl_multi_values_add_arg!(Url);
163impl_multi_values_add_arg!(HashMap<String, String>);
164impl_multi_values_add_arg!(serde_json::Value);
165
166impl MultiValuesAddArgSealed for &str {}
167
168impl MultiValuesAddArg<'_> for &str {
169    type Item = String;
170
171    #[inline]
172    fn apply_add(self, target: &mut MultiValues) -> ValueResult<()> {
173        <MultiValues as MultiValuesAdder<String>>::add_value(target, self.to_string())
174    }
175}
176
177impl MultiValuesAddArgSealed for Vec<&str> {}
178
179impl MultiValuesAddArg<'_> for Vec<&str> {
180    type Item = String;
181
182    #[inline]
183    fn apply_add(self, target: &mut MultiValues) -> ValueResult<()> {
184        let owned: Vec<String> = self.into_iter().map(|s| s.to_string()).collect();
185        <MultiValues as MultiValuesMultiAdder<String>>::add_values(target, owned)
186    }
187}
188
189impl<'b> MultiValuesAddArgSealed for &'b [&'b str] {}
190
191impl<'b> MultiValuesAddArg<'b> for &'b [&'b str] {
192    type Item = String;
193
194    #[inline]
195    fn apply_add(self, target: &mut MultiValues) -> ValueResult<()> {
196        let owned: Vec<String> = self.iter().map(|s| (*s).to_string()).collect();
197        <MultiValues as MultiValuesMultiAdder<String>>::add_values(target, owned)
198    }
199}
200
201impl MultiValuesAddArgSealed for &Vec<&str> {}
202
203impl MultiValuesAddArg<'_> for &Vec<&str> {
204    type Item = String;
205
206    #[inline]
207    fn apply_add(self, target: &mut MultiValues) -> ValueResult<()> {
208        let owned: Vec<String> = self.iter().map(|s| (*s).to_string()).collect();
209        <MultiValues as MultiValuesMultiAdder<String>>::add_values(target, owned)
210    }
211}
212
213impl<const N: usize> MultiValuesAddArgSealed for [&str; N] {}
214
215impl<const N: usize> MultiValuesAddArg<'_> for [&str; N] {
216    type Item = String;
217
218    #[inline]
219    fn apply_add(self, target: &mut MultiValues) -> ValueResult<()> {
220        let owned: Vec<String> = self.into_iter().map(str::to_string).collect();
221        <MultiValues as MultiValuesMultiAdder<String>>::add_values(target, owned)
222    }
223}
224
225impl<const N: usize> MultiValuesAddArgSealed for &[&str; N] {}
226
227impl<const N: usize> MultiValuesAddArg<'_> for &[&str; N] {
228    type Item = String;
229
230    #[inline]
231    fn apply_add(self, target: &mut MultiValues) -> ValueResult<()> {
232        let owned: Vec<String> = self.iter().map(|s| (*s).to_string()).collect();
233        <MultiValues as MultiValuesMultiAdder<String>>::add_values(target, owned)
234    }
235}