fire_postgres/
macros.rs

1#[macro_export]
2macro_rules! try_res_opt {
3	($exp:expr) => {
4		match $exp {
5			Ok(o) => $crate::try2!(o),
6			Err(e) => return Err(e.into()),
7		}
8	};
9}
10
11#[macro_export]
12macro_rules! try2 {
13	($exp:expr) => {
14		match $exp {
15			Some(o) => o,
16			None => return Ok(None),
17		}
18	};
19}
20
21#[macro_export]
22macro_rules! try_vec {
23	($exp:expr) => {
24		match $exp {
25			Some(o) => o,
26			None => return Ok(vec![]),
27		}
28	};
29}
30
31/// ## Example
32/// ```
33/// use fire_postgres::enum_u16;
34/// enum_u16! {
35/// 	#[derive(Debug)]
36/// 	pub enum SiteRaw {
37/// 		FrameUser = 10,
38/// 		Admin = 20,
39/// 		App = 30
40/// 	}
41/// }
42/// ```
43#[macro_export]
44macro_rules! enum_u16 {// u32
45	($(#[$metas:meta])* $($pub:ident)? enum $name:ident {
46		$($opt:ident = $num:expr),*
47	}) => {
48		$(#[$metas])*
49		#[repr(u16)]
50		$($pub)? enum $name {
51			$($opt = $num),*
52		}
53
54		impl $name {
55
56			pub fn as_u16(&self) -> u16 {
57				match self {
58					$(Self::$opt => $num),*
59				}
60			}
61
62			pub fn from_u16(
63				num: u16
64			) -> std::result::Result<Self, &'static str> {
65				match num {
66					$($num => Ok(Self::$opt)),*,
67					_ => Err(stringify!(could not parse u16 to $name))
68				}
69			}
70
71		}
72
73		impl $crate::table::column::ColumnType for $name {
74
75			fn column_kind() -> $crate::table::column::ColumnKind {
76				$crate::table::column::ColumnKind::I32
77			}
78
79			fn to_data(&self) -> $crate::table::column::ColumnData<'_> {
80				$crate::table::column::ColumnData::I32(self.as_u16() as i32)
81			}
82
83			fn from_data(
84				data: $crate::table::column::ColumnData
85			) -> std::result::Result<Self, $crate::table::column::FromDataError> {
86				use std::convert::TryFrom;
87				use $crate::table::column::FromDataError as __FromDataError;
88
89				match data {
90					$crate::table::column::ColumnData::I32(v) => {
91						let num = u16::try_from(v)
92							.map_err(|_| __FromDataError::Custom(
93								"cannot convert i32 to u32"
94							))?;
95						$name::from_u16(num)
96							.map_err(|m| __FromDataError::Custom(m))
97					},
98					_ => Err(__FromDataError::ExpectedType("u32"))
99				}
100			}
101
102		}
103	};
104}
105
106/// ## Note
107/// This panics if the data cannot be serialized.
108#[cfg(feature = "json")]
109#[macro_export]
110macro_rules! impl_json_col_type {
111	($struct:ident) => {
112		impl $crate::table::column::ColumnType for $struct {
113			fn column_kind() -> $crate::table::column::ColumnKind {
114				$crate::table::column::ColumnKind::Json
115			}
116
117			fn to_data(&self) -> $crate::table::column::ColumnData<'_> {
118				let s = $crate::serde_json::to_string(self).expect(&format!(
119					"could not serialize {}",
120					stringify!($struct)
121				));
122				$crate::table::column::ColumnData::Text(s.into())
123			}
124
125			fn from_data(
126				data: $crate::table::column::ColumnData,
127			) -> std::result::Result<Self, $crate::table::column::FromDataError>
128			{
129				match data {
130					$crate::table::column::ColumnData::Text(s) => {
131						$crate::serde_json::from_str(s.as_str()).map_err(|e| {
132							$crate::table::column::FromDataError::CustomString(
133								e.to_string(),
134							)
135						})
136					}
137					_ => {
138						Err($crate::table::column::FromDataError::ExpectedType(
139							"str for json",
140						))
141					}
142				}
143			}
144		}
145	};
146}