diff --git a/src/models.rs b/src/models.rs index d93385a..d03f6f3 100644 --- a/src/models.rs +++ b/src/models.rs @@ -3,7 +3,7 @@ use diesel::deserialize::{self, FromSql, FromSqlRow}; use diesel::pg::{Pg, PgValue}; use diesel::serialize::{IsNull, Output, ToSql}; use diesel::*; -use serde::{Deserialize, Serialize}; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::io::Write; use diesel::expression::AsExpression; use crate::schema::sql_types::BatteryStatusEnum; @@ -24,7 +24,7 @@ pub struct Location { bear: Option, } -#[derive(Debug, FromSqlRow, AsExpression, Serialize, Deserialize)] +#[derive(Debug, FromSqlRow, AsExpression)] #[diesel(sql_type = BatteryStatusEnum)] pub enum BatteryStatus { Unknown, @@ -56,3 +56,35 @@ impl FromSql for BatteryStatus { } } } + +// Custom JSON representation (if you want numbers in JSON) +impl Serialize for BatteryStatus { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + let code = match self { + BatteryStatus::Unknown => 0, + BatteryStatus::Unplugged => 1, + BatteryStatus::Charging => 2, + BatteryStatus::Full => 3, + }; + serializer.serialize_u8(code) + } +} + +impl<'de> Deserialize<'de> for BatteryStatus { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let v = u8::deserialize(deserializer)?; + match v { + 0 => Ok(BatteryStatus::Unknown), + 1 => Ok(BatteryStatus::Unplugged), + 2 => Ok(BatteryStatus::Charging), + 3 => Ok(BatteryStatus::Full), + _ => Err(serde::de::Error::custom("invalid battery status code")), + } + } +} \ No newline at end of file