qubit_value/multi_values/
multi_values_add_arg.rs1use 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
33trait MultiValuesAddArgSealed {}
35
36#[allow(private_bounds)]
40pub trait MultiValuesAddArg<'a>: MultiValuesAddArgSealed {
41 type Item: 'a + Clone;
43
44 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}