use core::{borrow::Borrow, error::Error, fmt, marker::PhantomData};
use munge::munge;
use rancor::Fallible;
use crate::{Archive, Place, Portable, Serialize};
pub struct EntryAdapter<BK, BV, K, V> {
pub key: BK,
pub value: BV,
_phantom: PhantomData<(K, V)>,
}
impl<BK, BV, K, V> EntryAdapter<BK, BV, K, V> {
pub fn new(key: BK, value: BV) -> Self {
Self {
key,
value,
_phantom: PhantomData,
}
}
}
pub struct EntryResolver<K, V> {
pub key: K,
pub value: V,
}
impl<BK, BV, K, V> Archive for EntryAdapter<BK, BV, K, V>
where
BK: Borrow<K>,
BV: Borrow<V>,
K: Archive,
V: Archive,
{
type Archived = Entry<K::Archived, V::Archived>;
type Resolver = EntryResolver<K::Resolver, V::Resolver>;
fn resolve(&self, resolver: Self::Resolver, out: Place<Self::Archived>) {
munge!(let Entry { key, value } = out);
K::resolve(self.key.borrow(), resolver.key, key);
V::resolve(self.value.borrow(), resolver.value, value);
}
}
impl<S, BK, BV, K, V> Serialize<S> for EntryAdapter<BK, BV, K, V>
where
S: Fallible + ?Sized,
BK: Borrow<K>,
BV: Borrow<V>,
K: Serialize<S>,
V: Serialize<S>,
{
fn serialize(
&self,
serializer: &mut S,
) -> Result<Self::Resolver, S::Error> {
Ok(EntryResolver {
key: self.key.borrow().serialize(serializer)?,
value: self.value.borrow().serialize(serializer)?,
})
}
}
#[derive(Debug, Portable, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[cfg_attr(feature = "bytecheck", derive(bytecheck::CheckBytes))]
#[rkyv(crate)]
#[repr(C)]
pub struct Entry<K, V> {
pub key: K,
pub value: V,
}
#[derive(Debug)]
pub struct IteratorLengthMismatch {
pub expected: usize,
pub actual: usize,
}
impl fmt::Display for IteratorLengthMismatch {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"iterator claimed that it contained {} elements, but yielded {} \
items during iteration",
self.expected, self.actual,
)
}
}
impl Error for IteratorLengthMismatch {}