enum accepts numbers from json

This commit is contained in:
2026-01-29 16:43:10 +01:00
parent c68a6222e7
commit e0432dbc8c

View File

@@ -3,7 +3,7 @@ use diesel::deserialize::{self, FromSql, FromSqlRow};
use diesel::pg::{Pg, PgValue}; use diesel::pg::{Pg, PgValue};
use diesel::serialize::{IsNull, Output, ToSql}; use diesel::serialize::{IsNull, Output, ToSql};
use diesel::*; use diesel::*;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::io::Write; use std::io::Write;
use diesel::expression::AsExpression; use diesel::expression::AsExpression;
use crate::schema::sql_types::BatteryStatusEnum; use crate::schema::sql_types::BatteryStatusEnum;
@@ -24,7 +24,7 @@ pub struct Location {
bear: Option<BigDecimal>, bear: Option<BigDecimal>,
} }
#[derive(Debug, FromSqlRow, AsExpression, Serialize, Deserialize)] #[derive(Debug, FromSqlRow, AsExpression)]
#[diesel(sql_type = BatteryStatusEnum)] #[diesel(sql_type = BatteryStatusEnum)]
pub enum BatteryStatus { pub enum BatteryStatus {
Unknown, Unknown,
@@ -56,3 +56,35 @@ impl FromSql<BatteryStatusEnum, Pg> for BatteryStatus {
} }
} }
} }
// Custom JSON representation (if you want numbers in JSON)
impl Serialize for BatteryStatus {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
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<D>(deserializer: D) -> Result<Self, D::Error>
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")),
}
}
}