Skip to content

Commit

Permalink
Implement serde as bytes for GenericArray<u8, N>
Browse files Browse the repository at this point in the history
  • Loading branch information
nickray committed Jun 8, 2020
1 parent 8377e2e commit f16afe2
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 1 deletion.
37 changes: 36 additions & 1 deletion src/serde_as_bytes/de.rs
Original file line number Diff line number Diff line change
@@ -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};

Expand All @@ -24,6 +24,41 @@ impl<'de: 'a, 'a> Deserialize<'de> for &'a [u8] {
}
}

impl<'de, N> Deserialize<'de> for GenericArray<u8, N>
where
N: ArrayLength<u8>,
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
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<u8>,
{
type Value = GenericArray<u8, N>;

fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str("a sequence")
}

fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
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<u8, N>
where
N: ArrayLength<u8>,
Expand Down
12 changes: 12 additions & 0 deletions src/serde_as_bytes/ser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,18 @@ impl Serialize for [u8] {
}
}

impl<N> Serialize for generic_array::GenericArray<u8, N>
where
N: ArrayLength<u8>
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_bytes(self.as_slice())
}
}

impl<N> Serialize for crate::Vec<u8, N>
where
N: ArrayLength<u8>
Expand Down

0 comments on commit f16afe2

Please sign in to comment.