Skip to main content

RulesVerdict

Enum RulesVerdict 

Source
pub enum RulesVerdict {
    Proven,
    Unproven,
    Failing,
}
Expand description

What the whole corpus can be said to prove, in one word, before any number is read.

satisfied answers a narrower question — are there findings — and a corpus in which no blocking rule was ever run has none, because not run, gated and reviewed are weaker states rather than defects (docs/DOCTRINE.md). Read alone, satisfied: true over such a corpus says “every rule is enforced” about a repository that has shown nothing. The verdict is the answer that cannot be read that way: it is proven only when every blocking rule is proven — a passing run recorded on a clean tree, at a commit that nothing but the evidence ledger has changed since. A rule whose inputs are merely unchanged is not that (ADR 0041), and leaves the corpus unproven.

§Example

use majordomus_cli::rules::{RuleState, RulesVerdict};
// a corpus with a finding is failing, whatever else is true of it
assert_eq!(RulesVerdict::of([RuleState::Proven], true), RulesVerdict::Failing);
// one blocking rule never run is enough to leave the corpus unproven
assert_eq!(
    RulesVerdict::of([RuleState::Proven, RuleState::NotRun], false),
    RulesVerdict::Unproven
);
assert_eq!(RulesVerdict::of([RuleState::Proven], false), RulesVerdict::Proven);
// a pass whose inputs are merely unchanged is not proven
assert_eq!(
    RulesVerdict::of([RuleState::Proven, RuleState::InputsUnchanged], false),
    RulesVerdict::Unproven
);

Variants§

§

Proven

Every blocking rule is proven: a passing run recorded on a clean tree, at a commit that nothing but the evidence ledger has changed since.

§

Unproven

No rule is a finding, and at least one blocking rule is not proven — never run, gated, reviewed, stale, or passing with only its inputs unchanged — or there is no blocking rule at all.

§

Failing

At least one rule declares a class its proof does not support.

Implementations§

Source§

impl RulesVerdict

Source

pub fn of( blocking: impl IntoIterator<Item = RuleState>, any_finding: bool, ) -> Self

Decide the verdict from the state of every blocking rule and whether any finding exists.

Only proven counts. stale does not: a pass older than its subject is a pass of something else. Nor does inputs unchanged: a run recorded on a dirty tree, or one whose repository has moved since, is the absence of a known invalidation and not proof (ADR 0041), and a corpus verdict of proven over it would be the one badge the evidence states exist to refuse. An empty set of blocking rules is unproven, not proven — a corpus that claims nothing has shown nothing, and success by vacancy is the number that stops meaning anything.

use majordomus_cli::rules::{RuleState, RulesVerdict};
assert_eq!(RulesVerdict::of([RuleState::Stale], false), RulesVerdict::Unproven);
assert_eq!(RulesVerdict::of([], false), RulesVerdict::Unproven);
assert_eq!(
    RulesVerdict::of([RuleState::InputsUnchanged], false),
    RulesVerdict::Unproven
);
Source

pub fn label(self) -> &'static str

The one word every surface prints for this verdict, and the one word a script greps for: the serialised form and the rendered form are the same string, so a reader and a parser can never be told different things about the same report. The three are proven, unproven and failing, and the middle one exists because “no finding” and “proven” are not the same answer — RulesVerdict::meaning says why in prose.

use majordomus_cli::rules::RulesVerdict;
assert_eq!(RulesVerdict::Unproven.label(), "unproven");
assert_eq!(RulesVerdict::Proven.label(), "proven");
assert_eq!(RulesVerdict::Failing.label(), "failing");
Source

pub fn meaning(self) -> &'static str

What the verdict asserts, in one sentence, carried beside the label so that a reader is never left to infer it from a colour or a word.

The sentence is the whole point of the type. A report that found no fault used to be rendered as a pass, and “no rule is a finding” is a far weaker statement than “every blocking rule is proven”: the first is satisfied by a corpus nothing has ever run. unproven says that distinction out loud, in the one place a person reads, so that an absence of findings cannot be quoted as proof.

use majordomus_cli::rules::RulesVerdict;
assert!(RulesVerdict::Unproven.meaning().contains("not a finding"));
assert!(RulesVerdict::Proven.meaning().contains("Every blocking rule"));

Trait Implementations§

Source§

impl Clone for RulesVerdict

Source§

fn clone(&self) -> RulesVerdict

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for RulesVerdict

Source§

impl Debug for RulesVerdict

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for RulesVerdict

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Eq for RulesVerdict

Source§

impl Hash for RulesVerdict

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl JsonSchema for RulesVerdict

Source§

fn schema_name() -> Cow<'static, str>

The name of the generated JSON Schema. Read more
Source§

fn schema_id() -> Cow<'static, str>

Returns a string that uniquely identifies the schema produced by this type. Read more
Source§

fn json_schema(generator: &mut SchemaGenerator) -> Schema

Generates a JSON Schema for this type. Read more
Source§

fn inline_schema() -> bool

Whether JSON Schemas generated for this type should be included directly in parent schemas, rather than being re-used where possible using the $ref keyword. Read more
Source§

impl Ord for RulesVerdict

Source§

fn cmp(&self, other: &RulesVerdict) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 (const: unstable) · Source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 (const: unstable) · Source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 (const: unstable) · Source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for RulesVerdict

Source§

fn eq(&self, other: &RulesVerdict) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl PartialOrd for RulesVerdict

Source§

fn partial_cmp(&self, other: &RulesVerdict) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 (const: unstable) · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 (const: unstable) · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 (const: unstable) · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 (const: unstable) · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl Serialize for RulesVerdict

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl StructuralPartialEq for RulesVerdict

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> AsOut<T> for T
where T: Copy,

§

fn as_out(&mut self) -> Out<'_, T>

Returns an out reference to self.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where Q: Ord + ?Sized, K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more