sqlx_core/any/
arguments.rs

1use 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}