xio_instructionset 0.5.0

XIO instructionset data structures
Documentation
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())
}