pub struct PassDetail {
pub name: String,
pub comparator: Cow<'static, str>,
pub value: String,
pub expected: Option<String>,
pub phase: Option<Cow<'static, str>>,
}Expand description
Structured record of a single passing claim — the positive
counterpart to AssertDetail. Populated by Verdict’s
record_pass_unary / record_pass_binary helpers at every
comparator’s pass arm so the auto-repro renderer (and any other
consumer that wants per-claim fidelity) can iterate passes
alongside fails.
Carries the same shape primitives every comparator naturally has
at the pass site: the claim’s name, a short comparator
token ("eq", "ge", "is_finite", …), the value that was
compared (formatted via the comparator’s Display), and an
optional expected for binary comparators. Unary comparators
(e.g. is_finite, set_is_empty) leave expected = None.
comparator is a wire-canonical token from
COMPARATOR_VOCABULARY, NOT a string derived from the builder
method name. Operator-named comparators map to operator-canonical
tokens (eq/ne/ge/le/lt/gt) regardless of whether the
invoking builder method is eq or at_least — tokens are the
stable wire vocabulary, methods are the ergonomic surface. A
renderer that wants pretty operators can map ge → >= on output.
Container-bound comparators prefix their tokens with the
container type name (set_*, sequence_*) to disambiguate same-
named operations across surfaces (contains is ambiguous between
sets and sequences, so prefix; is_finite is scalar-only, so
bare). The prefix policy is part of the vocabulary contract.
comparator is a Cow<'static, str> so call sites passing a
&'static str literal — the universal case for built-in
comparators — pay zero allocation; runtime-built comparator
labels store as Cow::Owned. The same Cow shape applies to
phase (set by the per-step RAII guard’s static label in the
common case).
Structurally distinct from AssertDetail: PassDetail
carries a uniform per-claim shape (every comparator emits
name + comparator + value + expected), while AssertDetail
uses a kind: DetailKind category enum because failure /
note / warning shapes diverge. Forcing them to one mold would
either lose comparator-typed slots (collapse to kind+message)
or invent a Pass variant of DetailKind that doesn’t carry the
typed slots cleanly. Keeping them separate is a deliberate
design choice, not an inconsistency.
Distinct from a one-line tracing log — the structured form is
the data path the auto-repro renderer reads to compose the
bracketed phase output that surfaces passing context alongside
failing assertions. The tracing log path remains the
operator-facing surface for --nocapture runs.
Fields§
§name: String§comparator: Cow<'static, str>§value: String§expected: Option<String>§phase: Option<Cow<'static, str>>Scenario phase the claim was made under. None outside any
PhaseGuard scope; Some(label) when the active-phase
thread-local has been installed at the scenario-driver step
loop entry. The auto-repro renderer groups passes by this
field to compose the bracketed ==== PHASE N: <label> ====
output. Cow<'static, str> so the common case (the RAII
guard’s static &'static str label) pays zero allocation.
Implementations§
Source§impl PassDetail
impl PassDetail
Sourcepub fn binary(
name: impl Into<String>,
comparator: impl Into<Cow<'static, str>>,
value: impl Into<String>,
expected: impl Into<String>,
) -> Self
pub fn binary( name: impl Into<String>, comparator: impl Into<Cow<'static, str>>, value: impl Into<String>, expected: impl Into<String>, ) -> Self
Construct a binary-comparator pass record (e.g. eq, ge,
in_range). Both value and expected are stringified via
std::fmt::Display at the call site so the struct is
T-agnostic on the wire. See COMPARATOR_VOCABULARY for
the full set of canonical tokens.
Sourcepub fn unary(
name: impl Into<String>,
comparator: impl Into<Cow<'static, str>>,
value: impl Into<String>,
) -> Self
pub fn unary( name: impl Into<String>, comparator: impl Into<Cow<'static, str>>, value: impl Into<String>, ) -> Self
Construct a unary-comparator pass record (e.g. is_finite,
set_is_empty). expected is left None — the comparator
name alone carries the meaning. See COMPARATOR_VOCABULARY
for the full set of canonical tokens.
Sourcepub fn with_phase(self, phase: impl Into<Cow<'static, str>>) -> Self
pub fn with_phase(self, phase: impl Into<Cow<'static, str>>) -> Self
Builder-style setter for Self::phase. Consumes self,
stamps the phase label, returns the updated value so
per-phase test fixtures and the PhaseGuard RAII helper can chain
PassDetail::binary(...).with_phase("step_0").
&'static str literals stay Cow::Borrowed (zero alloc);
runtime-built String becomes Cow::Owned.
Trait Implementations§
Source§impl Clone for PassDetail
impl Clone for PassDetail
Source§fn clone(&self) -> PassDetail
fn clone(&self) -> PassDetail
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for PassDetail
impl Debug for PassDetail
Source§impl<'de> Deserialize<'de> for PassDetail
impl<'de> Deserialize<'de> for PassDetail
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl PartialEq for PassDetail
impl PartialEq for PassDetail
Source§impl Serialize for PassDetail
impl Serialize for PassDetail
impl Eq for PassDetail
impl StructuralPartialEq for PassDetail
Auto Trait Implementations§
impl Freeze for PassDetail
impl RefUnwindSafe for PassDetail
impl Send for PassDetail
impl Sync for PassDetail
impl Unpin for PassDetail
impl UnwindSafe for PassDetail
Blanket Implementations§
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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