use serde::Deserialize;
use serde::Serialize;
use std::io::Write;
#[cfg(feature = "diesel")]
use {
diesel::backend::Backend,
diesel::deserialize::FromSql,
diesel::pg::Pg,
diesel::serialize::{IsNull, Output, ToSql},
diesel::sql_types::Varchar,
diesel::{deserialize, not_none, serialize},
};
#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "diesel", derive(AsExpression, FromSqlRow))]
#[cfg_attr(feature = "diesel", sql_type = "Varchar")]
pub enum MicroscopeEvent {
StepperXStop,
StepperYStop,
StepperZStop,
StepperXHighLimit,
StepperYHighLimit,
StepperZHighLimit,
StepperXLowLimit,
StepperYLowLimit,
StepperZLowLimit,
StepperError,
CameraPictureUpdate,
CameraError,
}
#[cfg(feature = "diesel")]
impl MicroscopeEvent {
pub fn to_string(&self) -> String {
let res = match *self {
MicroscopeEvent::StepperXStop => "stepperXStop",
MicroscopeEvent::StepperYStop => "stepperYStop",
MicroscopeEvent::StepperZStop => "stepperZStop",
MicroscopeEvent::StepperXHighLimit => "stepperXHighLimit",
MicroscopeEvent::StepperYHighLimit => "stepperYHighLimit",
MicroscopeEvent::StepperZHighLimit => "stepperZHighLimit",
MicroscopeEvent::StepperXLowLimit => "stepperXLowLimit",
MicroscopeEvent::StepperYLowLimit => "stepperYLowLimit",
MicroscopeEvent::StepperZLowLimit => "stepperZLowLimit",
MicroscopeEvent::StepperError => "stepperError",
MicroscopeEvent::CameraPictureUpdate => "cameraPictureUpdate",
MicroscopeEvent::CameraError => "cameraError",
};
res.to_string()
}
pub fn get_string(event: MicroscopeEvent) -> String {
let res = match event {
MicroscopeEvent::StepperXStop => "stepperXStop",
MicroscopeEvent::StepperYStop => "stepperYStop",
MicroscopeEvent::StepperZStop => "stepperZStop",
MicroscopeEvent::StepperXHighLimit => "stepperXHighLimit",
MicroscopeEvent::StepperYHighLimit => "stepperYHighLimit",
MicroscopeEvent::StepperZHighLimit => "stepperZHighLimit",
MicroscopeEvent::StepperXLowLimit => "stepperXLowLimit",
MicroscopeEvent::StepperYLowLimit => "stepperYLowLimit",
MicroscopeEvent::StepperZLowLimit => "stepperZLowLimit",
MicroscopeEvent::StepperError => "stepperError",
MicroscopeEvent::CameraPictureUpdate => "cameraPictureUpdate",
MicroscopeEvent::CameraError => "cameraError",
};
res.to_string()
}
pub fn from_string(str: String) -> Option<MicroscopeEvent> {
let str = str.as_str();
return match str {
"stepperXStop" => Option::from(MicroscopeEvent::StepperXStop),
"stepperYStop" => Option::from(MicroscopeEvent::StepperYStop),
"stepperZStop" => Option::from(MicroscopeEvent::StepperZStop),
"stepperXHighLimit" => Option::from(MicroscopeEvent::StepperXHighLimit),
"stepperYHighLimit" => Option::from(MicroscopeEvent::StepperYHighLimit),
"stepperZHighLimit" => Option::from(MicroscopeEvent::StepperZHighLimit),
"stepperXLowLimit" => Option::from(MicroscopeEvent::StepperXLowLimit),
"stepperYLowLimit" => Option::from(MicroscopeEvent::StepperYLowLimit),
"stepperZLowLimit" => Option::from(MicroscopeEvent::StepperZLowLimit),
"stepperError" => Option::from(MicroscopeEvent::StepperError),
"cameraPictureUpdate" => Option::from(MicroscopeEvent::CameraPictureUpdate),
"cameraError" => Option::from(MicroscopeEvent::CameraError),
_ => None,
};
}
}
#[cfg(feature = "diesel")]
impl ToSql<Varchar, Pg> for MicroscopeEvent {
fn to_sql<W: Write>(&self, out: &mut Output<W, Pg>) -> serialize::Result {
match *self {
MicroscopeEvent::StepperXStop => out.write_all(b"stepperXStop")?,
MicroscopeEvent::StepperYStop => out.write_all(b"stepperYStop")?,
MicroscopeEvent::StepperZStop => out.write_all(b"stepperZStop")?,
MicroscopeEvent::StepperXHighLimit => out.write_all(b"stepperXHighLimit")?,
MicroscopeEvent::StepperYHighLimit => out.write_all(b"stepperYHighLimit")?,
MicroscopeEvent::StepperZHighLimit => out.write_all(b"stepperZHighLimit")?,
MicroscopeEvent::StepperXLowLimit => out.write_all(b"stepperXLowLimit")?,
MicroscopeEvent::StepperYLowLimit => out.write_all(b"stepperYLowLimit")?,
MicroscopeEvent::StepperZLowLimit => out.write_all(b"stepperZLowLimit")?,
MicroscopeEvent::StepperError => out.write_all(b"stepperError")?,
MicroscopeEvent::CameraPictureUpdate => out.write_all(b"cameraPictureUpdate")?,
MicroscopeEvent::CameraError => out.write_all(b"cameraError")?,
}
Ok(IsNull::No)
}
}
#[cfg(feature = "diesel")]
impl FromSql<Varchar, Pg> for MicroscopeEvent {
fn from_sql(bytes: Option<&<Pg as Backend>::RawValue>) -> deserialize::Result<Self> {
match not_none!(bytes) {
b"stepperXStop" => Ok(MicroscopeEvent::StepperXStop),
b"stepperYStop" => Ok(MicroscopeEvent::StepperYStop),
b"stepperZStop" => Ok(MicroscopeEvent::StepperZStop),
b"stepperXHighLimit" => Ok(MicroscopeEvent::StepperXHighLimit),
b"stepperYHighLimit" => Ok(MicroscopeEvent::StepperYHighLimit),
b"stepperZHighLimit" => Ok(MicroscopeEvent::StepperZHighLimit),
b"stepperXLowLimit" => Ok(MicroscopeEvent::StepperXLowLimit),
b"stepperYLowLimit" => Ok(MicroscopeEvent::StepperYLowLimit),
b"stepperZLowLimit" => Ok(MicroscopeEvent::StepperZLowLimit),
b"stepperError" => Ok(MicroscopeEvent::StepperError),
b"cameraPictureUpdate" => Ok(MicroscopeEvent::CameraPictureUpdate),
b"cameraError" => Ok(MicroscopeEvent::CameraError),
_ => Err("Unrecognized enum variant".into()),
}
}
}