diff --git a/src/serde_utils/list_of_hex_fixed_vec.rs b/src/serde_utils/list_of_hex_fixed_vec.rs new file mode 100644 index 0000000..b93c869 --- /dev/null +++ b/src/serde_utils/list_of_hex_fixed_vec.rs @@ -0,0 +1,77 @@ +//! Serialize `VariableList, N>` as list of 0x-prefixed hex string. +use crate::{FixedVector, VariableList}; +use serde::{ser::SerializeSeq, Deserialize, Deserializer, Serialize, Serializer}; +use std::marker::PhantomData; +use typenum::Unsigned; + +#[derive(Deserialize)] +#[serde(transparent)] +pub struct WrappedListOwned( + #[serde(with = "crate::serde_utils::hex_fixed_vec")] FixedVector, +); + +#[derive(Serialize)] +#[serde(transparent)] +pub struct WrappedListRef<'a, N: Unsigned>( + #[serde(with = "crate::serde_utils::hex_fixed_vec")] &'a FixedVector, +); + +pub fn serialize( + list: &VariableList, N>, + serializer: S, +) -> Result +where + S: Serializer, + M: Unsigned, + N: Unsigned, +{ + let mut seq = serializer.serialize_seq(Some(list.len()))?; + for bytes in list { + seq.serialize_element(&WrappedListRef(bytes))?; + } + seq.end() +} + +#[derive(Default)] +pub struct Visitor { + _phantom_m: PhantomData, + _phantom_n: PhantomData, +} + +impl<'a, M, N> serde::de::Visitor<'a> for Visitor +where + M: Unsigned, + N: Unsigned, +{ + type Value = VariableList, N>; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(formatter, "a list of 0x-prefixed hex bytes") + } + + fn visit_seq(self, mut seq: A) -> Result + where + A: serde::de::SeqAccess<'a>, + { + let mut list: VariableList, N> = <_>::default(); + + while let Some(val) = seq.next_element::>()? { + list.push(val.0).map_err(|e| { + serde::de::Error::custom(format!("failed to push value to list: {:?}.", e)) + })?; + } + + Ok(list) + } +} + +pub fn deserialize<'de, D, M, N>( + deserializer: D, +) -> Result, N>, D::Error> +where + D: Deserializer<'de>, + M: Unsigned, + N: Unsigned, +{ + deserializer.deserialize_seq(Visitor::default()) +} diff --git a/src/serde_utils/mod.rs b/src/serde_utils/mod.rs index cd6d49c..4417f5a 100644 --- a/src/serde_utils/mod.rs +++ b/src/serde_utils/mod.rs @@ -1,5 +1,6 @@ pub mod hex_fixed_vec; pub mod hex_var_list; +pub mod list_of_hex_fixed_vec; pub mod list_of_hex_var_list; pub mod quoted_u64_fixed_vec; pub mod quoted_u64_var_list;