#[path = "type_guard.rs"]
mod guard;
use crate::descriptor::NamespacedName;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct FaultAdapter<Behavior, Postcondition> {
behavior: Behavior,
postcondition: Postcondition,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct SequencePosition(u32);
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ScheduledFault<Behavior, Postcondition> {
position: SequencePosition,
adapter: FaultAdapter<Behavior, Postcondition>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct FaultSchedule<Behavior, Postcondition> {
name: NamespacedName,
faults: Vec<ScheduledFault<Behavior, Postcondition>>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct FaultCampaign<Behavior, Postcondition> {
schedules: Vec<FaultSchedule<Behavior, Postcondition>>,
}
#[must_use = "a refusal is the reason a fault campaign was not built"]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FaultCampaignRefusal {
NoSchedule,
DuplicateSchedule(NamespacedName),
NoFaultDeclared,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct CampaignSelection<'campaign, Behavior, Postcondition> {
schedule: &'campaign FaultSchedule<Behavior, Postcondition>,
}
#[must_use = "a refusal is the reason a fault schedule was not selected"]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FaultSelectionRefusal {
ScheduleAbsent(NamespacedName),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct InjectedCommand<Command, Behavior, Postcondition> {
command: Command,
faults: Vec<FaultAdapter<Behavior, Postcondition>>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct InjectedSequence<Command, Behavior, Postcondition> {
schedule: NamespacedName,
commands: Vec<InjectedCommand<Command, Behavior, Postcondition>>,
}
#[must_use = "a refusal is the reason a selected fault schedule was not injected"]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FaultInjectionRefusal {
SequenceTooLong {
commands: usize,
},
PositionOutsideSequence {
position: SequencePosition,
commands: usize,
},
}