use crate::*;
use alux_sdk::trait_algebra;
use ambassador::delegatable_trait;
#[delegatable_trait]
pub trait QueueDryRunAlg: ManagerSorts {
fn set_queue_dry_run(&mut self, id: Self::Id, dry_run: bool);
}
#[delegatable_trait]
pub trait RehearsalStateAlg: ManagerSorts {
fn apply_rehearsal_event(&mut self, id: Self::Id, event: RehearsalObservationOp<Self::Change>);
}
pub trait RehearsalViewAlg {
type Change;
fn rehearsal(&self) -> RehearsalState<'_>;
fn planned_changes(&self) -> impl Iterator<Item = &Self::Change>;
}
pub trait PlannedChangeAlg {
fn change_path(&self) -> &str;
fn change_kind(&self) -> ChangeKind;
fn change_size(&self) -> Option<u64>;
}
#[trait_algebra(derive(Clone, Debug, PartialEq, Eq))]
pub trait RehearsalObservation {
type Change;
fn started(&self);
fn reported(&self, changes: Vec<Self::Change>);
fn failed(&self, message: String);
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum RehearsalState<'a> {
Unrehearsed,
Rehearsing,
Reported,
Failed(&'a str),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ChangeKind {
Create,
Update,
Delete,
Unchanged,
}
impl ChangeKind {
pub const REPORTED: [Self; 4] = [Self::Create, Self::Update, Self::Delete, Self::Unchanged];
#[must_use]
pub const fn alters(self) -> bool {
!matches!(self, Self::Unchanged)
}
}