use core::{fmt, marker::PhantomData};
use std::{string::String, vec::Vec};
use serde::de::{Error, Unexpected, Visitor};
use serde_core as serde;
use super::*;
impl<S> serde::Serialize for Utf8Bytes<S>
where
RawBytes<S>: ImmutableStorage,
{
fn serialize<Ser>(&self, serializer: Ser) -> Result<Ser::Ok, Ser::Error>
where
Ser: serde::Serializer,
{
serializer.serialize_str(self.as_str())
}
}
struct Utf8BytesVisitor<S>(PhantomData<S>);
impl<S> Visitor<'_> for Utf8BytesVisitor<S>
where
RawBytes<S>: ImmutableStorage,
{
type Value = Utf8Bytes<S>;
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str("a string")
}
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where
E: Error,
{
Ok(Utf8Bytes::from(v))
}
fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
where
E: Error,
{
Ok(Utf8Bytes::from(v))
}
fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
where
E: Error,
{
Utf8Bytes::<S>::try_from(v).map_err(|_| E::invalid_value(Unexpected::Bytes(v), &self))
}
fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
where
E: Error,
{
Utf8Bytes::<S>::try_from(v)
.map_err(|error| E::invalid_value(Unexpected::Bytes(error.as_bytes()), &self))
}
}
impl<'de, S> serde::Deserialize<'de> for Utf8Bytes<S>
where
RawBytes<S>: ImmutableStorage,
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
deserializer.deserialize_string(Utf8BytesVisitor(PhantomData))
}
}