From f16afe23c2f6e33ef4f993b55b966b36bcc470ce Mon Sep 17 00:00:00 2001 From: nicolas-solokeys Date: Sat, 23 May 2020 00:29:55 +0200 Subject: [PATCH] Implement serde as bytes for GenericArray --- src/serde_as_bytes/de.rs | 37 ++++++++++++++++++++++++++++++++++++- src/serde_as_bytes/ser.rs | 12 ++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/serde_as_bytes/de.rs b/src/serde_as_bytes/de.rs index c768c2ba8e..22203ea57a 100644 --- a/src/serde_as_bytes/de.rs +++ b/src/serde_as_bytes/de.rs @@ -1,6 +1,6 @@ use core::{fmt, marker}; -use generic_array::ArrayLength; +use generic_array::{ArrayLength, GenericArray}; use serde::Deserializer; use serde::de::{Error, Visitor}; @@ -24,6 +24,41 @@ impl<'de: 'a, 'a> Deserialize<'de> for &'a [u8] { } } +impl<'de, N> Deserialize<'de> for GenericArray +where + N: ArrayLength, +{ + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + struct ValueVisitor<'de, N>(marker::PhantomData<(&'de (), N)>); + + impl<'de, N> serde::de::Visitor<'de> for ValueVisitor<'de, N> + where + N: ArrayLength, + { + type Value = GenericArray; + + fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + formatter.write_str("a sequence") + } + + fn visit_bytes(self, v: &[u8]) -> Result + where + E: serde::de::Error, + { + if v.len() > N::to_usize() { + return Err(E::invalid_length(v.len(), &self))?; + } + Ok(GenericArray::clone_from_slice(v)) + } + } + + deserializer.deserialize_bytes(ValueVisitor(marker::PhantomData)) + } +} + impl<'de, N> Deserialize<'de> for Vec where N: ArrayLength, diff --git a/src/serde_as_bytes/ser.rs b/src/serde_as_bytes/ser.rs index f2af6f8bb5..25a8b28407 100644 --- a/src/serde_as_bytes/ser.rs +++ b/src/serde_as_bytes/ser.rs @@ -18,6 +18,18 @@ impl Serialize for [u8] { } } +impl Serialize for generic_array::GenericArray +where + N: ArrayLength +{ + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.serialize_bytes(self.as_slice()) + } +} + impl Serialize for crate::Vec where N: ArrayLength