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
33pub trait MultiValuesAddArg<'a>: super::sealed::MultiValuesAddArgSealed {
37 type Item: 'a + Clone;
39
40 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}