use std::error::Error;
use std::fmt::{self, Debug, Display, Formatter};
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum InsertError<K, V> {
EntryTooLarge {
key: K,
value: V,
entry_size: usize,
max_size: usize
}
}
impl<K, V> Display for InsertError<K, V> {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
InsertError::EntryTooLarge { .. } =>
write!(f, "entry does not fit in cache")
}
}
}
impl<K: Debug, V: Debug> Error for InsertError<K, V> { }
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum MutateError<K, V> {
EntryTooLarge {
key: K,
value: V,
old_entry_size: usize,
new_entry_size: usize,
max_size: usize
}
}
impl<K, V> Display for MutateError<K, V> {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
MutateError::EntryTooLarge { .. } =>
write!(f, "modified entry does not fit in cache")
}
}
}
impl<K: Debug, V: Debug> Error for MutateError<K, V> { }
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum TryInsertError<K, V> {
OccupiedEntry {
key: K,
value: V,
},
WouldEjectLru {
key: K,
value: V,
entry_size: usize,
free_memory: usize
},
EntryTooLarge {
key: K,
value: V,
entry_size: usize,
max_size: usize
}
}
impl<K, V> Display for TryInsertError<K, V> {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
TryInsertError::OccupiedEntry { .. } =>
write!(f, "key already has associated entry"),
TryInsertError::WouldEjectLru { .. } =>
write!(f, "entry does not fit within remaining memory"),
TryInsertError::EntryTooLarge { .. } =>
write!(f, "entry does not fit in cache")
}
}
}
impl<K: Debug, V: Debug> Error for TryInsertError<K, V> { }
impl<K, V> TryInsertError<K, V> {
pub fn entry(&self) -> (&K, &V) {
match self {
TryInsertError::OccupiedEntry { key, value, .. } => (key, value),
TryInsertError::WouldEjectLru { key, value, .. } => (key, value),
TryInsertError::EntryTooLarge { key, value, .. } => (key, value)
}
}
pub fn key(&self) -> &K {
self.entry().0
}
pub fn value(&self) -> &V {
self.entry().1
}
pub fn into_entry(self) -> (K, V) {
match self {
TryInsertError::OccupiedEntry { key, value, .. } => (key, value),
TryInsertError::WouldEjectLru { key, value, .. } => (key, value),
TryInsertError::EntryTooLarge { key, value, .. } => (key, value)
}
}
pub fn into_key(self) -> K {
self.into_entry().0
}
pub fn into_value(self) -> V {
self.into_entry().1
}
}