56 lines
1.7 KiB
Rust
56 lines
1.7 KiB
Rust
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<SmallInt, Sqlite> for ServerStatus{
|
|
fn from_sql(bytes: SqliteValue) -> diesel::deserialize::Result<Self> {
|
|
let t = <i16 as FromSql<SmallInt, Sqlite>>::from_sql(bytes)?;
|
|
if let Some(status) = ServerStatus::from_i16(t) {
|
|
return Ok(status)
|
|
}
|
|
Ok(ServerStatus::Unknown)
|
|
}
|
|
}
|
|
|
|
impl ToSql<SmallInt, Sqlite> 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)
|
|
}
|
|
}
|