chuchi_postgres/macros/
mod.rs1#[doc(hidden)]
2pub use bytes::BytesMut;
3#[doc(hidden)]
4pub use postgres_types::{FromSql, IsNull, ToSql, Type, to_sql_checked};
5
6#[macro_export]
19macro_rules! try2 {
20	($exp:expr) => {
21		match $exp {
22			Some(o) => o,
23			None => return Ok(None),
24		}
25	};
26}
27
28#[macro_export]
39macro_rules! try_vec {
40	($exp:expr) => {
41		match $exp {
42			Some(o) => o,
43			None => return Ok(vec![]),
44		}
45	};
46}
47
48#[macro_export]
61macro_rules! enum_u16 {
62	($(#[$metas:meta])* $($pub:ident)? enum $name:ident {
63		$($opt:ident = $num:expr),*
64	}) => {
65		$(#[$metas])*
66		#[repr(u16)]
67		$($pub)? enum $name {
68			$($opt = $num),*
69		}
70
71		impl $name {
72			pub fn as_u16(&self) -> u16 {
73				match self {
74					$(Self::$opt => $num),*
75				}
76			}
77
78			pub fn from_u16(
79				num: u16
80			) -> std::result::Result<Self, &'static str> {
81				match num {
82					$($num => Ok(Self::$opt)),*,
83					_ => Err(stringify!(could not parse u16 to $name))
84				}
85			}
86		}
87
88		impl $crate::table::column::ColumnType for $name {
89			fn column_kind() -> $crate::table::column::ColumnKind {
90				$crate::table::column::ColumnKind::I32
91			}
92		}
93
94		impl $crate::macros::ToSql for $name {
95			fn to_sql(
96				&self,
97				ty: &$crate::macros::Type,
98				buf: &mut $crate::macros::BytesMut
99			) -> std::result::Result<$crate::macros::IsNull, Box<dyn std::error::Error + Sync + Send>> {
100				let val = self.as_u16() as i32;
101
102				val.to_sql(ty, buf)
103			}
104
105			fn accepts(ty: &$crate::macros::Type) -> bool {
106				<i32 as $crate::macros::ToSql>::accepts(ty)
107			}
108
109			$crate::macros::to_sql_checked!();
110		}
111
112		impl<'a> $crate::macros::FromSql<'a> for $name {
113			fn from_sql(
114				ty: &$crate::macros::Type,
115				buf: &'a [u8]
116			) -> std::result::Result<Self, Box<dyn std::error::Error + Sync + Send>> {
117				let num = <i32 as $crate::macros::FromSql>::from_sql(ty, buf)?;
118				num.try_into()
119					.map_err(|_| "i32 to u16 conversion failed")
120					.and_then(Self::from_u16)
121					.map_err(|m| m.into())
122			}
123
124			fn accepts(ty: &$crate::macros::Type) -> bool {
125				<i32 as $crate::macros::FromSql>::accepts(ty)
126			}
127		}
128
129		impl $crate::filter::ParamData for $name {
130			fn is_null(&self) -> bool {
131				false
132			}
133		}
134	};
135}