HoldSpec

Enum HoldSpec 

Source
pub enum HoldSpec {
    Frac(f64),
    Fixed(Duration),
    Loop {
        interval: Duration,
    },
}
Expand description

How a step advances after its ops are applied. Frac and Fixed hold for a duration; Loop repeatedly re-applies Step::ops at a fixed interval instead of holding.

Construct via the constructor methods (Self::fixed, Self::frac, Self::loop_at, or the Self::FULL const) — variant syntax is reserved for pattern-matching in match arms.

Copy because every variant carries only Copy types (f64, Duration); reuse the same HoldSpec value across multiple Step::new / Step::with_defs / Step::with_payload calls in a construction loop without an explicit .clone(). PartialEq is derived so tests can assert_eq!(step.hold, ...) and user code can pattern-compare values directly — float equality on Frac(f64) follows IEEE 754 semantics (so HoldSpec::Frac(0.1 + 0.2) != HoldSpec::Frac(0.3), and HoldSpec::Frac(f64::NAN) != HoldSpec::Frac(f64::NAN)Self::validate rejects NaN at intake so the non-reflexive case is unreachable through validated construction, but the derive inherits the IEEE 754 contract at the type level). Eq / Hash remain impossible because Frac carries a float.

Variants§

§

Frac(f64)

Fraction of the total scenario duration.

§

Fixed(Duration)

Fixed duration.

§

Loop

Repeat the step’s ops in a loop at the given interval until the remaining scenario time is exhausted.

Fields

§interval: Duration

Implementations§

Source§

impl HoldSpec

Source

pub const FULL: HoldSpec

Hold for the full scenario duration. Equivalent to HoldSpec::frac(1.0) and resolves to ctx.duration at scenario-run time.

Source

pub const fn fixed(d: Duration) -> HoldSpec

Hold for a fixed wall-clock duration. Sugar for HoldSpec::Fixed(d) that reads naturally in chain position (Step::new(ops, HoldSpec::fixed(Duration::from_secs(5)))) and surfaces in IDE autocomplete next to Self::frac and Self::loop_at.

For the common settle + duration * fraction pattern, prefer Ctx::settled_hold over HoldSpec::fixed(ctx.settle + ctx.duration.mul_f64(frac)).

Source

pub const fn frac(f: f64) -> HoldSpec

Hold for a fraction of ctx.duration (the scenario duration configured on crate::scenario::Ctx). Sugar for HoldSpec::Frac(f); the resolved wall-clock hold is ctx.duration * f (e.g. 0.5 = half the scenario duration). f must be finite and > 0.0 — see Self::validate for the rejection rules.

Source

pub const fn loop_at(interval: Duration) -> HoldSpec

Repeat the step’s ops at the given interval until the remaining scenario time is exhausted. Sugar for HoldSpec::Loop { interval }; the value is interval. Must be non-zero — see Self::validate for the rejection rule.

Named loop_at (verb-preposition) rather than r#loop because the variant name Loop collides with the Rust keyword looploop_at reads as “loop AT this interval” and avoids the raw-identifier escape. Sibling constructors Self::fixed / Self::frac match their variant names directly (no keyword conflict).

Source

pub fn validate(&self) -> Result<(), String>

Reject hold values that are vacuous (no-op step) or would panic downstream.

Rules:

  • Fixed(Duration::ZERO) — valid for settle steps and op-only steps that apply changes without holding.
  • Frac(f) with !f.is_finite() (NaN/Inf) — propagates into Duration::from_secs_f64(f) which panics.
  • Frac(f) with f <= 0.0 — zero is vacuous, negative panics in Duration::from_secs_f64.
  • Loop { interval: Duration::ZERO } — busy-polls the deadline loop without yielding; almost always a typo.

Trait Implementations§

Source§

impl Clone for HoldSpec

Source§

fn clone(&self) -> HoldSpec

Returns a duplicate of the value. Read more
1.0.0 · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Debug for HoldSpec

Source§

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

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

impl PartialEq for HoldSpec

Source§

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

Tests for self and other values to be equal, and is used by ==.
1.0.0 · 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 Copy for HoldSpec

Source§

impl StructuralPartialEq for HoldSpec

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
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
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
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.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

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

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
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<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

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
§

impl<T> MaybeSend for T
where T: Send,

§

impl<T> MaybeSend for T
where T: Send,