sqlx_core/any/
arguments.rs

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