rspack_cacheable 0.100.0-rc.2

rspack_cacheable
Documentation
use std::borrow::Cow;

use rkyv::{
  Place,
  rancor::Fallible,
  with::{ArchiveWith, DeserializeWith, SerializeWith},
};

use crate::{utils::OwnedOrRef, with::AsCacheable};

pub struct AsOwned<T = AsCacheable> {
  _inner: T,
}

impl<'a, T, F> ArchiveWith<Cow<'a, F>> for AsOwned<T>
where
  T: ArchiveWith<F>,
  F: ToOwned + 'a,
{
  type Archived = T::Archived;
  type Resolver = T::Resolver;

  fn resolve_with(field: &Cow<F>, resolver: Self::Resolver, out: Place<Self::Archived>) {
    T::resolve_with(field, resolver, out);
  }
}

impl<'a, T, F, S> SerializeWith<Cow<'a, F>, S> for AsOwned<T>
where
  T: SerializeWith<F, S>,
  F: ToOwned + 'a,
  S: Fallible + ?Sized,
{
  fn serialize_with(field: &Cow<F>, s: &mut S) -> Result<Self::Resolver, S::Error> {
    T::serialize_with(field, s)
  }
}

impl<'a, T, F, D> DeserializeWith<T::Archived, Cow<'a, F>, D> for AsOwned<T>
where
  T: ArchiveWith<F> + DeserializeWith<T::Archived, F, D>,
  F: ToOwned<Owned = F> + 'a,
  D: Fallible + ?Sized,
{
  fn deserialize_with(field: &T::Archived, d: &mut D) -> Result<Cow<'a, F>, D::Error> {
    let f = T::deserialize_with(field, d)?;
    Ok(Cow::Owned(f))
  }
}

impl<'a, T, F> ArchiveWith<OwnedOrRef<'a, F>> for AsOwned<T>
where
  T: ArchiveWith<F>,
{
  type Archived = T::Archived;
  type Resolver = T::Resolver;

  fn resolve_with(field: &OwnedOrRef<F>, resolver: Self::Resolver, out: Place<Self::Archived>) {
    T::resolve_with(field.as_ref(), resolver, out);
  }
}

impl<'a, T, F, S> SerializeWith<OwnedOrRef<'a, F>, S> for AsOwned<T>
where
  T: SerializeWith<F, S>,
  S: Fallible + ?Sized,
{
  fn serialize_with(field: &OwnedOrRef<F>, s: &mut S) -> Result<Self::Resolver, S::Error> {
    T::serialize_with(field.as_ref(), s)
  }
}

impl<'a, T, F, D> DeserializeWith<T::Archived, OwnedOrRef<'a, F>, D> for AsOwned<T>
where
  T: ArchiveWith<F> + DeserializeWith<T::Archived, F, D>,
  D: Fallible + ?Sized,
{
  fn deserialize_with(field: &T::Archived, d: &mut D) -> Result<OwnedOrRef<'a, F>, D::Error> {
    let f = T::deserialize_with(field, d)?;
    Ok(OwnedOrRef::Owned(f))
  }
}