#[path = "type_guard.rs"]
mod guard;
#[derive(Debug, Clone, Copy)]
pub(in crate::clock) enum Source {
Unavailable,
Available(Reader),
}
#[derive(Debug, Clone, Copy)]
pub(in crate::clock) enum Reader {
Infallible(fn() -> u64),
Fallible(fn() -> Result<u64, ClockReadRefusal>),
}
#[derive(Debug, Clone, Copy)]
pub struct HarnessClock {
pub(in crate::clock) source: Source,
}
#[must_use = "a measurement start must be finished to produce its reading"]
#[derive(Debug)]
pub struct MeasurementStart {
pub(in crate::clock) opening: Opening,
}
#[derive(Debug)]
pub(in crate::clock) enum Opening {
Unavailable,
Failed(ClockFailure),
Opened {
reader: Reader,
tick: MeasurementTick,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct MeasurementTick(u64);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct RecordedDuration(u64);
#[must_use = "a refusal is the caller source's stated read failure"]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ClockReadRefusal {
Refused,
}
#[must_use = "a failure is why an offered measurement produced no duration"]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ClockFailure {
OpeningRefused,
ClosingRefused,
OpeningUnwound,
ClosingUnwound,
Regressed {
opened: MeasurementTick,
closed: MeasurementTick,
},
}
#[must_use = "a measurement reading is a report fact"]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum MeasurementReading {
Observed(RecordedDuration),
Unavailable,
Failed(ClockFailure),
}