From e0432dbc8cf2c1b31956a1cedb2b4ba7f0eb0316 Mon Sep 17 00:00:00 2001 From: marco Date: Thu, 29 Jan 2026 16:43:10 +0100 Subject: [PATCH] enum accepts numbers from json --- src/models.rs | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) 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