sqlx_core_oldapi/any/
decode.rs

1use crate::decode::Decode;
2use crate::types::Type;
3
4#[cfg(feature = "odbc")]
5use crate::odbc::Odbc;
6
7#[cfg(feature = "postgres")]
8use crate::postgres::Postgres;
9
10#[cfg(feature = "mysql")]
11use crate::mysql::MySql;
12
13#[cfg(feature = "mssql")]
14use crate::mssql::Mssql;
15
16#[cfg(feature = "sqlite")]
17use crate::sqlite::Sqlite;
18
19// Implements Decode for any T where T supports Decode for any database that has support currently
20// compiled into SQLx
21macro_rules! impl_any_decode {
22    ($ty:ty) => {
23        impl<'r> crate::decode::Decode<'r, crate::any::Any> for $ty
24        where
25            $ty: crate::any::AnyDecode<'r>,
26        {
27            fn decode(
28                value: crate::any::AnyValueRef<'r>,
29            ) -> Result<Self, crate::error::BoxDynError> {
30                match value.kind {
31                    #[cfg(feature = "mysql")]
32                    crate::any::value::AnyValueRefKind::MySql(value) => {
33                        <$ty as crate::decode::Decode<'r, crate::mysql::MySql>>::decode(value)
34                    }
35
36                    #[cfg(feature = "sqlite")]
37                    crate::any::value::AnyValueRefKind::Sqlite(value) => {
38                        <$ty as crate::decode::Decode<'r, crate::sqlite::Sqlite>>::decode(value)
39                    }
40
41                    #[cfg(feature = "mssql")]
42                    crate::any::value::AnyValueRefKind::Mssql(value) => {
43                        <$ty as crate::decode::Decode<'r, crate::mssql::Mssql>>::decode(value)
44                    }
45
46                    #[cfg(feature = "postgres")]
47                    crate::any::value::AnyValueRefKind::Postgres(value) => {
48                        <$ty as crate::decode::Decode<'r, crate::postgres::Postgres>>::decode(value)
49                    }
50
51                    #[cfg(feature = "odbc")]
52                    crate::any::value::AnyValueRefKind::Odbc(value) => {
53                        <$ty as crate::decode::Decode<'r, crate::odbc::Odbc>>::decode(value)
54                    }
55                }
56            }
57        }
58    };
59}
60
61// Callback macro that generates the actual trait and impl
62macro_rules! impl_any_decode_for_databases {
63    ($($db:ident),+) => {
64        pub trait AnyDecode<'r>: $(Decode<'r, $db> + Type<$db> +)+ 'r {}
65
66        impl<'r, T> AnyDecode<'r> for T
67        where
68            T: $(Decode<'r, $db> + Type<$db> +)+ 'r
69        {}
70    };
71}
72
73// Generate all combinations
74for_all_feature_combinations! {
75    entries: [
76        ("postgres", Postgres),
77        ("mysql", MySql),
78        ("mssql", Mssql),
79        ("sqlite", Sqlite),
80        ("odbc", Odbc),
81    ],
82    callback: impl_any_decode_for_databases
83}