medullah_web/macros/
enum_diesel.rs

1#[macro_export]
2/// Implements Diesel's FromSql and ToSql traits for the given enum.
3/// <br/>**Note:** FromStr, and AsStr traits must be implemented for the given enum
4macro_rules! impl_enum_diesel_traits {
5    ($variant_name:ident) => {
6        impl diesel::deserialize::FromSql<diesel::sql_types::Text, diesel::pg::Pg>
7            for $variant_name
8        {
9            fn from_sql(bytes: diesel::pg::PgValue) -> diesel::deserialize::Result<Self> {
10                use std::str::FromStr;
11
12                let value = <String as diesel::deserialize::FromSql<
13                    diesel::sql_types::Text,
14                    diesel::pg::Pg,
15                >>::from_sql(bytes)?;
16                match $variant_name::from_str(value.as_str()) {
17                    Ok(variant) => Ok(variant),
18                    Err(err) => Err(err.to_string().into()),
19                }
20            }
21        }
22
23        impl diesel::serialize::ToSql<diesel::sql_types::Text, diesel::pg::Pg> for $variant_name {
24            fn to_sql(
25                &self,
26                out: &mut diesel::serialize::Output<diesel::pg::Pg>,
27            ) -> diesel::serialize::Result {
28                use std::io::Write;
29
30                let value = self.to_string();
31                out.write_all(value.as_bytes())?;
32                Ok(diesel::serialize::IsNull::No)
33            }
34        }
35    };
36}