use rkyv::rancor::{Fallible, Source};
use rkyv::ser::{Allocator, Writer};
use rkyv::string::{ArchivedString, StringResolver};
use rkyv::vec::{ArchivedVec, VecResolver};
use rkyv::{Archive, Deserialize, Place, Serialize, SerializeUnsized};
use super::{EcoByteString, EcoString};
impl Archive for EcoString {
type Archived = ArchivedString;
type Resolver = StringResolver;
fn resolve(&self, resolver: Self::Resolver, out: Place<Self::Archived>) {
ArchivedString::resolve_from_str(self.as_str(), resolver, out);
}
}
impl<Ser> Serialize<Ser> for EcoString
where
Ser: Fallible + ?Sized,
Ser::Error: Source,
str: SerializeUnsized<Ser>,
{
fn serialize(&self, serializer: &mut Ser) -> Result<StringResolver, Ser::Error> {
ArchivedString::serialize_from_str(self.as_str(), serializer)
}
}
impl<D> Deserialize<EcoString, D> for ArchivedString
where
D: Fallible + ?Sized,
{
fn deserialize(&self, _: &mut D) -> Result<EcoString, D::Error> {
Ok(EcoString::from(self.as_str()))
}
}
impl Archive for EcoByteString {
type Archived = ArchivedVec<u8>;
type Resolver = VecResolver;
fn resolve(&self, resolver: Self::Resolver, out: Place<Self::Archived>) {
ArchivedVec::resolve_from_slice(self.as_bytes(), resolver, out);
}
}
impl<Ser> Serialize<Ser> for EcoByteString
where
Ser: Fallible + Allocator + Writer + ?Sized,
{
fn serialize(&self, serializer: &mut Ser) -> Result<VecResolver, Ser::Error> {
ArchivedVec::<u8>::serialize_from_slice(self.as_bytes(), serializer)
}
}
impl<D> Deserialize<EcoByteString, D> for ArchivedVec<u8>
where
D: Fallible + ?Sized,
{
fn deserialize(&self, _: &mut D) -> Result<EcoByteString, D::Error> {
Ok(EcoByteString::from_bytes(self.as_slice()))
}
}