use alloc::vec::Vec;
use core::fmt;
use serde_core::{
Deserializer,
de::{Error, SeqAccess, Visitor},
};
pub(crate) fn deserialize_byte_buf<'de, D>(
deserializer: D,
) -> Result<Vec<u8>, D::Error>
where
D: Deserializer<'de>,
{
struct BytesVisitor;
impl<'de2> Visitor<'de2> for BytesVisitor {
type Value = Vec<u8>;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
write!(formatter, "a byte array")
}
fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
where
E: Error,
{
Ok(v.to_vec())
}
fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
where
E: Error,
{
Ok(v)
}
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
where
A: SeqAccess<'de2>,
{
let hint = seq.size_hint().unwrap_or(0);
let mut out = Vec::with_capacity(hint.min(4096));
while let Some(byte) = seq.next_element()? {
out.push(byte);
}
Ok(out)
}
}
deserializer.deserialize_byte_buf(BytesVisitor)
}