@@ -13,3 +13,38 @@ sql_function!(fn floor(x: Double) -> Integer);
1313sql_function ! ( fn greatest<T : SingleValue >( x: T , y: T ) -> T ) ;
1414sql_function ! ( fn least<T : SingleValue >( x: T , y: T ) -> T ) ;
1515sql_function ! ( fn split_part( string: Text , delimiter: Text , n: Integer ) -> Text ) ;
16+
17+ #[ macro_export]
18+ macro_rules! pg_enum {
19+ (
20+ $vis: vis enum $name: ident {
21+ $( $item: ident = $int: expr, ) *
22+ }
23+ ) => {
24+ #[ derive( Debug , Copy , Clone , PartialEq , Eq , Serialize , Deserialize , FromSqlRow , AsExpression ) ]
25+ #[ diesel( sql_type = diesel:: sql_types:: Integer ) ]
26+ #[ serde( rename_all = "snake_case" ) ]
27+ #[ repr( i32 ) ]
28+ $vis enum $name {
29+ $( $item = $int, ) *
30+ }
31+
32+ impl diesel:: deserialize:: FromSql <diesel:: sql_types:: Integer , diesel:: pg:: Pg > for $name {
33+ fn from_sql( bytes: diesel:: pg:: PgValue <' _>) -> diesel:: deserialize:: Result <Self > {
34+ match <i32 as diesel:: deserialize:: FromSql <diesel:: sql_types:: Integer , diesel:: pg:: Pg >>:: from_sql( bytes) ? {
35+ $( $int => Ok ( Self :: $item) , ) *
36+ n => Err ( format!( "unknown value for {}: {}" , stringify!( $name) , n) . into( ) ) ,
37+ }
38+ }
39+ }
40+
41+ impl diesel:: serialize:: ToSql <diesel:: sql_types:: Integer , diesel:: pg:: Pg > for $name {
42+ fn to_sql(
43+ & self ,
44+ out: & mut diesel:: serialize:: Output <' _, ' _, diesel:: pg:: Pg >,
45+ ) -> diesel:: serialize:: Result {
46+ diesel:: serialize:: ToSql :: <diesel:: sql_types:: Integer , diesel:: pg:: Pg >:: to_sql( & ( * self as i32 ) , & mut out. reborrow( ) )
47+ }
48+ }
49+ }
50+ }
0 commit comments