enum accepts numbers from json
This commit is contained in:
@@ -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")),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user