use crate::store::Rule;
use crate::store::StorageError;
use crate::store::traits::StoredAs;
use error_stack::Report;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum OnUnreadable {
#[default]
Refuse,
UseDefault,
}
pub fn will_not_read(why: &Report<StorageError>) -> bool {
why.frames()
.filter_map(|frame| frame.downcast_ref::<StorageError>())
.any(|context| *context == StorageError::Codec)
}
impl OnUnreadable {
pub(crate) fn covers(&self, why: &Report<StorageError>) -> bool {
matches!(self, OnUnreadable::UseDefault) && will_not_read(why)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum UnreadableEntries {
#[default]
Refuse,
Skip,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct Fallbacks {
pub on_unreadable: OnUnreadable,
pub on_delete: OnDelete,
pub unreadable_entries: UnreadableEntries,
pub on_undeclared: OnUndeclared,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum OnUndeclared {
#[default]
Keep,
Drop,
}
impl Fallbacks {
pub fn on_unreadable(mut self, rule: OnUnreadable) -> Self {
self.on_unreadable = rule;
self
}
pub fn on_delete(mut self, rule: OnDelete) -> Self {
self.on_delete = rule;
self
}
pub fn unreadable_entries(mut self, rule: UnreadableEntries) -> Self {
self.unreadable_entries = rule;
self
}
pub fn on_undeclared(mut self, rule: OnUndeclared) -> Self {
self.on_undeclared = rule;
self
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum OnDelete {
#[default]
Keep,
UseDefault,
}
pub struct ReadRules<TValue> {
pub(crate) on_unreadable: OnUnreadable,
pub(crate) on_delete: OnDelete,
pub(crate) rule: Option<Rule<TValue>>,
pub(crate) stored_as: StoredAs<TValue>,
}
impl<TValue> Default for ReadRules<TValue> {
fn default() -> Self {
Self {
on_unreadable: OnUnreadable::default(),
on_delete: OnDelete::default(),
rule: None,
stored_as: StoredAs::default(),
}
}
}
impl<TValue> ReadRules<TValue> {
pub fn new() -> Self {
Self::default()
}
pub fn on_unreadable(mut self, policy: OnUnreadable) -> Self {
self.on_unreadable = policy;
self
}
pub fn stored_as(mut self, how: StoredAs<TValue>) -> Self {
self.stored_as = how;
self
}
pub fn on_delete(mut self, policy: OnDelete) -> Self {
self.on_delete = policy;
self
}
pub fn rule(mut self, rule: Rule<TValue>) -> Self {
self.rule = Some(rule);
self
}
}
pub trait DeclaredPolicy {
const ON_UNREADABLE: Option<OnUnreadable>;
const ON_DELETE: Option<OnDelete>;
const UNREADABLE_ENTRIES: Option<UnreadableEntries>;
}