pub enum Condition {
RateAbove {
selector: String,
hz: f64,
},
RateBelow {
selector: String,
hz: f64,
},
SilentFor {
selector: String,
for_s: f64,
},
InvalidPayload {
selector: String,
},
QosMismatch {
selector: String,
},
DoctorCheck {
check: CheckId,
},
OriginDown {
origin: String,
},
Dropped,
}decode only.Expand description
The closed condition vocabulary (#227), over the existing observation surface. Each variant names what firing means; the drop rules are in the judge functions this module documents.
Variants§
RateAbove
Samples on selector rode above hz over the evaluation window.
Firing is positive evidence, conclusive even under drops (a drop only
hides more); ok under drops is unobservable — the true rate is
higher than what was counted (O6).
RateBelow
Samples on selector rode below hz. A shortfall under drops is
unobservable — the dropped samples could have filled it (O6); enough
observed is conclusive ok regardless.
SilentFor
No sample matched selector for at least for_s seconds. Silence is
a completeness claim — it counts what did NOT happen — so it is
provable only over a drop-free span at least for_s long (O6), and
only once the observer has watched that long (O4).
InvalidPayload
An observed payload on selector did not reach crate::Verdict::Valid
(#159) — Invalid and NotValidated both count: asking for validity
and getting “unknowable” is not valid. Scoped to what was observed
and checked; the ok state claims “nothing checked failed”, never
“nothing invalid rode” — the drop count rides in the evidence.
QosMismatch
An observed sample on selector did not ride its registry-declared
QoS profile (RFC 04 §3). Same per-observed-sample scope as
Condition::InvalidPayload; samples with no declared profile are
unjudgeable and counted in the evidence, not the state.
DoctorCheck
A doctor run reported at least one finding with this check id
(the stable crate::report::CheckId vocabulary). A failed doctor run is
unobservable for every doctor condition — never ok.
OriginDown
The origin holds no alive token on the liveliness roster
(RFC 04 §5). A roster that could not be asked is unobservable —
silence is not a verdict (RFC 05 §3.1).
Dropped
The observer itself dropped samples this window (RFC 09 §5.1 O6) — self-knowledge, so never unobservable.
Implementations§
Source§impl Condition
impl Condition
Sourcepub fn parse(rule: &str) -> Result<Condition>
pub fn parse(rule: &str) -> Result<Condition>
Parse one rule: whitespace-separated, kind first (Zenoh key expressions cannot contain whitespace, so the split is unambiguous). The vocabulary is closed; anything else is an error that spells it.
Sourcepub fn selector(&self) -> Option<&str>
pub fn selector(&self) -> Option<&str>
The wire selector this condition observes, when it observes one.
Sourcepub fn judge(&self, ev: &TickEvidence<'_>) -> Eval
pub fn judge(&self, ev: &TickEvidence<'_>) -> Eval
Judge one observation window. None for the conditions that are not
window-scoped (Condition::DoctorCheck, Condition::OriginDown).
Judge this condition against everything one tick observed.
The single entry point, and why run_watchdog has no expects
left (#352). The three judges below each returned None for the
variants they do not own, which forced the caller to assert a
partition the compiler could not see — four times, every one
discharging the same claim. This match is the partition, and each
arm hands its judge exactly the evidence that judge needs, so none of
them has a None to return.
pub fn judge_window(&self, w: &CondWindow) -> Option<Eval>
Sourcepub fn judge_roster(
&self,
roster: Result<&BTreeMap<String, Vec<String>>, &str>,
) -> Option<Eval>
pub fn judge_roster( &self, roster: Result<&BTreeMap<String, Vec<String>>, &str>, ) -> Option<Eval>
Judge a roster ask. None unless this is Condition::OriginDown.
Err is the ask failing, which is unobservable — silence is not a
verdict (RFC 05 §3.1).
Sourcepub fn judge_doctor(&self, outcome: Result<&DoctorReport, &str>) -> Option<Eval>
pub fn judge_doctor(&self, outcome: Result<&DoctorReport, &str>) -> Option<Eval>
Judge a doctor run. None unless this is Condition::DoctorCheck.
A failed run is unobservable for every doctor condition — never ok.
Trait Implementations§
Source§impl Display for Condition
impl Display for Condition
Source§fn fmt(&self, f: &mut Formatter<'_>) -> Result
fn fmt(&self, f: &mut Formatter<'_>) -> Result
The canonical rule spelling — Condition::parse round-trips it,
and it is the rule field of every Transition.
impl StructuralPartialEq for Condition
Auto Trait Implementations§
impl Freeze for Condition
impl RefUnwindSafe for Condition
impl Send for Condition
impl Sync for Condition
impl Unpin for Condition
impl UnsafeUnpin for Condition
impl UnwindSafe for Condition
Blanket Implementations§
Source§impl<Source> AccessAs for Source
impl<Source> AccessAs for Source
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more