use super::{FailedTrial, Invocation, SeatFailure, SeatRefusal, Selection, SelectionPlan};
use crate::clock::HarnessClock;
use crate::descriptor::TrialTableRefusal;
use crate::report::{
EmptySelectionReason, InvocationProfile, SelectionExpectation, TargetBinding, TrialId,
TrialSite,
};
impl Invocation {
#[must_use]
pub fn declared(
profile: InvocationProfile,
target: TargetBinding,
site: TrialSite,
clock: HarnessClock,
) -> Self {
Self {
profile,
target,
site,
clock,
}
}
#[must_use]
pub const fn profile(&self) -> InvocationProfile {
self.profile
}
#[must_use]
pub const fn target(&self) -> &TargetBinding {
&self.target
}
#[must_use]
pub const fn site(&self) -> TrialSite {
self.site
}
#[must_use]
pub const fn clock(&self) -> HarnessClock {
self.clock
}
}
impl SelectionPlan {
#[must_use]
pub fn of(chooses: Selection) -> Self {
Self {
chooses,
expects: SelectionExpectation::AtLeastOne,
}
}
#[must_use]
pub fn allowing_empty(chooses: Selection, reason: EmptySelectionReason) -> Self {
Self {
chooses,
expects: SelectionExpectation::AllowEmpty(reason),
}
}
#[must_use]
pub const fn chooses(&self) -> &Selection {
&self.chooses
}
#[must_use]
pub const fn expects(&self) -> SelectionExpectation {
self.expects
}
}
impl FailedTrial {
#[must_use]
pub fn recorded(trial: TrialId, site: TrialSite, failure: SeatFailure) -> Self {
Self {
trial,
site,
failure,
}
}
#[must_use]
pub const fn trial(&self) -> TrialId {
self.trial
}
#[must_use]
pub const fn site(&self) -> TrialSite {
self.site
}
#[must_use]
pub const fn failure(&self) -> &SeatFailure {
&self.failure
}
}
impl SeatRefusal {
pub fn trial_failed(failed: FailedTrial) -> Self {
Self::TrialFailed(Box::new(failed))
}
}
impl From<TrialTableRefusal> for SeatRefusal {
fn from(refusal: TrialTableRefusal) -> Self {
Self::TableNotBuilt(refusal)
}
}