serwus 0.2.3

Helpers for building actix-web/diesel based services
Documentation
#[cfg(feature = "diesel")]
use diesel::{
    backend::Backend,
    deserialize::{self, FromSql},
    serialize::{self, Output, ToSql},
    sql_types::SmallInt,
};
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "diesel", derive(diesel::AsExpression, diesel::FromSqlRow))]
#[cfg_attr(feature = "diesel", diesel(sql_type = SmallInt))]
#[cfg_attr(feature = "paperclip", derive(paperclip::actix::Apiv2Schema))]
pub enum Role {
    User = 0,
    Admin = 1,
    SuperAdmin = 2,
    Tester = 3,
}

#[cfg(feature = "diesel")]
impl<DB: Backend> ToSql<SmallInt, DB> for Role
where
    i16: ToSql<SmallInt, DB>,
{
    fn to_sql<'b>(&'b self, out: &mut Output<'b, '_, DB>) -> serialize::Result {
        match *self {
            Role::User => 0.to_sql(out),
            Role::Admin => 1.to_sql(out),
            Role::SuperAdmin => 2.to_sql(out),
            Role::Tester => 3.to_sql(out),
        }
    }
}

#[cfg(feature = "diesel")]
impl<DB: Backend> FromSql<SmallInt, DB> for Role
where
    i16: FromSql<SmallInt, DB>,
{
    #[allow(deprecated)]
    fn from_sql(bytes: diesel::backend::RawValue<'_, DB>) -> deserialize::Result<Self> {
        let v = i16::from_sql(bytes)?;
        Ok(match v {
            0 => Role::User,
            1 => Role::Admin,
            2 => Role::SuperAdmin,
            3 => Role::Tester,
            v => return Err(format!("Unknown identity role {v:?}").into()),
        })
    }
}