Skip to main content

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