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