dxr_shared/impls/
to_params.rs

1use std::collections::HashMap;
2
3use chrono::{DateTime, Utc};
4
5use crate::error::DxrError;
6use crate::traits::{TryToParams, TryToValue};
7use crate::values::Value;
8
9use super::utils::*;
10
11// for simple values, use TryToValue to convert them
12
13impl TryToParams for Value {
14    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
15        Ok(vec![self.try_to_value()?])
16    }
17}
18
19impl TryToParams for &Value {
20    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
21        Ok(vec![self.try_to_value()?])
22    }
23}
24
25impl TryToParams for i32 {
26    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
27        Ok(vec![self.try_to_value()?])
28    }
29}
30
31#[cfg(feature = "i8")]
32impl TryToParams for i64 {
33    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
34        Ok(vec![self.try_to_value()?])
35    }
36}
37
38impl TryToParams for bool {
39    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
40        Ok(vec![self.try_to_value()?])
41    }
42}
43
44impl TryToParams for String {
45    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
46        Ok(vec![self.try_to_value()?])
47    }
48}
49
50impl TryToParams for &str {
51    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
52        Ok(vec![self.try_to_value()?])
53    }
54}
55
56impl TryToParams for f64 {
57    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
58        Ok(vec![self.try_to_value()?])
59    }
60}
61
62impl TryToParams for DateTime<Utc> {
63    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
64        Ok(vec![self.try_to_value()?])
65    }
66}
67
68impl TryToParams for Vec<u8> {
69    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
70        Ok(vec![self.try_to_value()?])
71    }
72}
73
74impl<const N: usize> TryToParams for [u8; N] {
75    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
76        Ok(vec![self.try_to_value()?])
77    }
78}
79
80impl TryToParams for &[u8] {
81    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
82        Ok(vec![self.try_to_value()?])
83    }
84}
85
86#[cfg(feature = "nil")]
87impl<T> TryToParams for Option<T>
88where
89    T: TryToValue,
90{
91    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
92        Ok(vec![self.try_to_value()?])
93    }
94}
95
96#[cfg(feature = "nil")]
97impl<T> TryToParams for &Option<T>
98where
99    T: TryToValue,
100{
101    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
102        Ok(vec![self.try_to_value()?])
103    }
104}
105
106// use collections as they are without wrapping them in another Vec
107
108impl<T> TryToParams for Vec<T>
109where
110    T: TryToValue,
111{
112    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
113        self.iter().map(|v| v.try_to_value()).collect()
114    }
115}
116
117impl<T, const N: usize> TryToParams for [T; N]
118where
119    T: TryToValue,
120{
121    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
122        self.iter().map(|v| v.try_to_value()).collect()
123    }
124}
125
126impl<T> TryToParams for &[T]
127where
128    T: TryToValue,
129{
130    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
131        self.iter().map(|v| v.try_to_value()).collect()
132    }
133}
134
135// treat maps as a single value of a struct
136
137impl<T> TryToParams for HashMap<String, T>
138where
139    T: TryToValue,
140{
141    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
142        Ok(vec![self.try_to_value()?])
143    }
144}
145
146impl<T> TryToParams for HashMap<&str, T>
147where
148    T: TryToValue,
149{
150    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
151        Ok(vec![self.try_to_value()?])
152    }
153}
154
155// treat tuples as collections of values of different types
156
157impl<T> TryToParams for (T,)
158where
159    T: TryToValue,
160{
161    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
162        tuple_to_values_1(self)
163    }
164}
165
166impl<A, B> TryToParams for (A, B)
167where
168    A: TryToValue,
169    B: TryToValue,
170{
171    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
172        tuple_to_values_2(self)
173    }
174}
175
176impl<A, B, C> TryToParams for (A, B, C)
177where
178    A: TryToValue,
179    B: TryToValue,
180    C: TryToValue,
181{
182    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
183        tuple_to_values_3(self)
184    }
185}
186
187impl<A, B, C, D> TryToParams for (A, B, C, D)
188where
189    A: TryToValue,
190    B: TryToValue,
191    C: TryToValue,
192    D: TryToValue,
193{
194    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
195        tuple_to_values_4(self)
196    }
197}
198
199impl<A, B, C, D, E> TryToParams for (A, B, C, D, E)
200where
201    A: TryToValue,
202    B: TryToValue,
203    C: TryToValue,
204    D: TryToValue,
205    E: TryToValue,
206{
207    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
208        tuple_to_values_5(self)
209    }
210}
211
212impl<A, B, C, D, E, F> TryToParams for (A, B, C, D, E, F)
213where
214    A: TryToValue,
215    B: TryToValue,
216    C: TryToValue,
217    D: TryToValue,
218    E: TryToValue,
219    F: TryToValue,
220{
221    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
222        tuple_to_values_6(self)
223    }
224}
225
226impl<A, B, C, D, E, F, G> TryToParams for (A, B, C, D, E, F, G)
227where
228    A: TryToValue,
229    B: TryToValue,
230    C: TryToValue,
231    D: TryToValue,
232    E: TryToValue,
233    F: TryToValue,
234    G: TryToValue,
235{
236    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
237        tuple_to_values_7(self)
238    }
239}
240
241impl<A, B, C, D, E, F, G, H> TryToParams for (A, B, C, D, E, F, G, H)
242where
243    A: TryToValue,
244    B: TryToValue,
245    C: TryToValue,
246    D: TryToValue,
247    E: TryToValue,
248    F: TryToValue,
249    G: TryToValue,
250    H: TryToValue,
251{
252    fn try_to_params(&self) -> Result<Vec<Value>, DxrError> {
253        tuple_to_values_8(self)
254    }
255}
256
257// if needed, implementations for more arguments can be implemented