Maybe fix tests, make UserFlags able to be deserialized from String or u64

This commit is contained in:
Quat3rnion 2024-06-18 08:46:07 -04:00
parent d7de1d2fb7
commit c9a36ce725
2 changed files with 20 additions and 3 deletions

View File

@ -155,8 +155,9 @@ impl Serialize for UserFlags {
impl<'de> Deserialize<'de> for UserFlags {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de> {
let s = String::deserialize(deserializer)?.parse::<u64>().map_err(serde::de::Error::custom)?;
// let s = String::deserialize(deserializer)?.parse::<u64>().map_err(serde::de::Error::custom)?;
let s = crate::types::serde::string_or_u64(deserializer)?;
Ok(UserFlags::from_bits(s).unwrap())
}
}

View File

@ -1,6 +1,7 @@
use core::fmt;
use chrono::{LocalResult, NaiveDateTime};
use serde::de;
use serde::{de, Deserialize, Deserializer};
use serde::de::Error;
#[doc(hidden)]
#[derive(Debug)]
@ -259,4 +260,19 @@ pub(crate) fn serde_from<T, E, V>(me: LocalResult<T>, _ts: &V) -> Result<T, E>
}
LocalResult::Single(val) => Ok(val),
}
}
#[derive(serde::Deserialize, serde::Serialize)]
#[serde(untagged)]
enum StringOrU64 {
String(String),
U64(u64),
}
pub fn string_or_u64<'de, D>(d: D) -> Result<u64, D::Error>
where D: Deserializer<'de> {
match StringOrU64::deserialize(d)? {
StringOrU64::String(s) => s.parse::<u64>().map_err(D::Error::custom),
StringOrU64::U64(u) => Ok(u)
}
}