use std::fmt; use diesel::{deserialize::{FromSql, FromSqlRow}, expression::AsExpression, serialize::{Output, ToSql}, sql_types::SmallInt, sqlite::{Sqlite, SqliteValue}}; use num_traits::FromPrimitive; use num_derive::FromPrimitive; use serde::{Deserialize, Serialize}; #[derive(FromSqlRow, Debug, AsExpression, FromPrimitive, Serialize, Deserialize, PartialEq, Clone)] #[diesel(sql_type = SmallInt)] #[repr(i16)] pub enum ServerStatus { Archived = 0, Stopped = 1, Stopping = 2, Starting = 3, Running = 4, Archiving = 5, Unknown, } impl FromSql for ServerStatus{ fn from_sql(bytes: SqliteValue) -> diesel::deserialize::Result { let t = >::from_sql(bytes)?; if let Some(status) = ServerStatus::from_i16(t) { return Ok(status) } Ok(ServerStatus::Unknown) } } impl ToSql for ServerStatus { fn to_sql<'b>(&'b self, out: &mut Output<'b, '_, Sqlite>) -> diesel::serialize::Result { let value: i16 = self.clone() as i16; out.set_value(value as i32); Ok(diesel::serialize::IsNull::No) } } impl fmt::Display for ServerStatus { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let str_status = match self { ServerStatus::Archived => "archived", ServerStatus::Archiving => "archiving", ServerStatus::Stopped => "stopped", ServerStatus::Stopping => "stopping", ServerStatus::Starting => "starting", ServerStatus::Running => "running", ServerStatus::Unknown => "(error : unknown status)", }; write!(f, "{}", str_status) } }