use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Delivery {
TargetHit,
Intercepted,
OffTarget,
NotSettled,
JsDispatch,
NotProbed,
}
impl Delivery {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::TargetHit => "target_hit",
Self::Intercepted => "intercepted",
Self::OffTarget => "off_target",
Self::NotSettled => "not_settled",
Self::JsDispatch => "js",
Self::NotProbed => "not_probed",
}
}
#[must_use]
pub fn parse(token: &str) -> Self {
match token {
"target_hit" => Self::TargetHit,
"intercepted" => Self::Intercepted,
"off_target" => Self::OffTarget,
"not_settled" => Self::NotSettled,
"js" => Self::JsDispatch,
_ => Self::NotProbed,
}
}
}
impl fmt::Display for Delivery {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Postcondition {
NotRead,
Kept,
Discarded,
Rewritten,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Delivered {
pub how: Delivery,
pub modal_receiver: bool,
pub observed_after_ms: Option<u64>,
}
impl Delivered {
pub const NOT_PROBED: Self =
Self { how: Delivery::NotProbed, modal_receiver: false, observed_after_ms: None };
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Observation {
ReportingDisabled,
ReadFailed,
NoBaseline,
Compared {
document_changed: bool,
identity_known: bool,
edits: usize,
moved: usize,
focus_moved: bool,
values_lost: usize,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PageSight {
Readable,
Unreadable,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn every_delivery_token_round_trips() {
for how in [
Delivery::TargetHit,
Delivery::Intercepted,
Delivery::OffTarget,
Delivery::NotSettled,
Delivery::JsDispatch,
Delivery::NotProbed,
] {
assert_eq!(Delivery::parse(how.as_str()), how);
}
assert_eq!(Delivery::parse("something else"), Delivery::NotProbed);
}
}