sqlx_core/any/
arguments.rs1use crate::any::value::AnyValueKind;
2use crate::any::{Any, AnyTypeInfoKind};
3use crate::arguments::Arguments;
4use crate::encode::{Encode, IsNull};
5use crate::error::BoxDynError;
6use crate::types::Type;
7
8pub struct AnyArguments<'q> {
9 #[doc(hidden)]
10 pub values: AnyArgumentBuffer<'q>,
11}
12
13impl<'q> Arguments<'q> for AnyArguments<'q> {
14 type Database = Any;
15
16 fn reserve(&mut self, additional: usize, _size: usize) {
17 self.values.0.reserve(additional);
18 }
19
20 fn add<T>(&mut self, value: T) -> Result<(), BoxDynError>
21 where
22 T: 'q + Encode<'q, Self::Database> + Type<Self::Database>,
23 {
24 let _: IsNull = value.encode(&mut self.values)?;
25 Ok(())
26 }
27
28 fn len(&self) -> usize {
29 self.values.0.len()
30 }
31}
32
33pub struct AnyArgumentBuffer<'q>(#[doc(hidden)] pub Vec<AnyValueKind<'q>>);
34
35impl<'q> Default for AnyArguments<'q> {
36 fn default() -> Self {
37 AnyArguments {
38 values: AnyArgumentBuffer(vec![]),
39 }
40 }
41}
42
43impl<'q> AnyArguments<'q> {
44 #[doc(hidden)]
45 pub fn convert_to<'a, A: Arguments<'a>>(&'a self) -> Result<A, BoxDynError>
46 where
47 'q: 'a,
48 Option<i32>: Type<A::Database> + Encode<'a, A::Database>,
49 Option<bool>: Type<A::Database> + Encode<'a, A::Database>,
50 Option<i16>: Type<A::Database> + Encode<'a, A::Database>,
51 Option<i32>: Type<A::Database> + Encode<'a, A::Database>,
52 Option<i64>: Type<A::Database> + Encode<'a, A::Database>,
53 Option<f32>: Type<A::Database> + Encode<'a, A::Database>,
54 Option<f64>: Type<A::Database> + Encode<'a, A::Database>,
55 Option<String>: Type<A::Database> + Encode<'a, A::Database>,
56 Option<Vec<u8>>: Type<A::Database> + Encode<'a, A::Database>,
57 bool: Type<A::Database> + Encode<'a, A::Database>,
58 i16: Type<A::Database> + Encode<'a, A::Database>,
59 i32: Type<A::Database> + Encode<'a, A::Database>,
60 i64: Type<A::Database> + Encode<'a, A::Database>,
61 f32: Type<A::Database> + Encode<'a, A::Database>,
62 f64: Type<A::Database> + Encode<'a, A::Database>,
63 &'a str: Type<A::Database> + Encode<'a, A::Database>,
64 &'a [u8]: Type<A::Database> + Encode<'a, A::Database>,
65 {
66 let mut out = A::default();
67
68 for arg in &self.values.0 {
69 match arg {
70 AnyValueKind::Null(AnyTypeInfoKind::Null) => out.add(Option::<i32>::None),
71 AnyValueKind::Null(AnyTypeInfoKind::Bool) => out.add(Option::<bool>::None),
72 AnyValueKind::Null(AnyTypeInfoKind::SmallInt) => out.add(Option::<i16>::None),
73 AnyValueKind::Null(AnyTypeInfoKind::Integer) => out.add(Option::<i32>::None),
74 AnyValueKind::Null(AnyTypeInfoKind::BigInt) => out.add(Option::<i64>::None),
75 AnyValueKind::Null(AnyTypeInfoKind::Real) => out.add(Option::<f64>::None),
76 AnyValueKind::Null(AnyTypeInfoKind::Double) => out.add(Option::<f32>::None),
77 AnyValueKind::Null(AnyTypeInfoKind::Text) => out.add(Option::<String>::None),
78 AnyValueKind::Null(AnyTypeInfoKind::Blob) => out.add(Option::<Vec<u8>>::None),
79 AnyValueKind::Bool(b) => out.add(b),
80 AnyValueKind::SmallInt(i) => out.add(i),
81 AnyValueKind::Integer(i) => out.add(i),
82 AnyValueKind::BigInt(i) => out.add(i),
83 AnyValueKind::Real(r) => out.add(r),
84 AnyValueKind::Double(d) => out.add(d),
85 AnyValueKind::Text(t) => out.add(&**t),
86 AnyValueKind::Blob(b) => out.add(&**b),
87 }?
88 }
89 Ok(out)
90 }
91}