diff options
Diffstat (limited to 'src/serde.rs')
-rw-r--r-- | src/serde.rs | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/serde.rs b/src/serde.rs new file mode 100644 index 0000000..76676d7 --- /dev/null +++ b/src/serde.rs @@ -0,0 +1,21 @@ +pub mod as_hex { + use serde::{de, Deserialize, Deserializer, Serializer}; + + pub fn serialize<const N: usize, S: Serializer>( + b: &[u8; N], + ser: S, + ) -> Result<S::Ok, S::Error> { + ser.serialize_str(&hex::encode(b)) + } + + pub fn deserialize<'de, const N: usize, D: Deserializer<'de>>( + des: D, + ) -> Result<[u8; N], D::Error> { + let raw = <String as Deserialize>::deserialize(des)?; + let mut result = [0; N]; + hex::decode_to_slice(&raw, &mut result).map_err(|_| { + de::Error::invalid_value(de::Unexpected::Other("non-hex string"), &"a hex string") + })?; + Ok(result) + } +} |