sqlx_core_oldapi/any/
decode.rs1use 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
19macro_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
61macro_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
73for_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}