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#[macro_export]
44macro_rules! enum_u16 {($(#[$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#[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}