use serde::de;
use serde::ser;
use std::fmt;
pub fn deserialize<'de, D>(deserializer: D) -> Result<u16, D::Error>
where
D: de::Deserializer<'de>,
{
struct FieldVisitor;
impl<'de> de::Visitor<'de> for FieldVisitor {
type Value = u16;
fn expecting(
&self,
formatter: &mut fmt::Formatter,
) -> fmt::Result {
formatter.write_str("a hexadecimal number string")
}
fn visit_str<E>(self, value: &str) -> Result<u16, E>
where
E: de::Error,
{
if value.len() < 2 || &value[0..2] != "0x" {
Err(de::Error::invalid_value(
de::Unexpected::Str(value),
&self,
))
} else {
u16::from_str_radix(&value[2..], 16).map_err(|_e| {
de::Error::invalid_value(
de::Unexpected::Str(value),
&self,
)
})
}
}
}
deserializer.deserialize_string(FieldVisitor)
}
pub fn serialize<S>(s: &u16, serializer: S) -> Result<S::Ok, S::Error>
where
S: ser::Serializer,
{
serializer.serialize_str(format!("0x{:x}", s).as_str())
}