Skip to main content

DepthCounter

Struct DepthCounter 

Source
pub struct DepthCounter { /* private fields */ }
Expand description

A lightweight depth counter for stack overflow protection.

Unlike RecursionGuard, DepthCounter does not track which keys are being visited — it only limits nesting depth. Use this when:

  • The same node/key may be legitimately revisited (e.g., expression re-checking with different contextual types)
  • You only need stack overflow protection, not cycle detection

§Safety

Shares the same debug-mode safety features as RecursionGuard:

  • Debug leak detection: Dropping with depth > 0 panics.
  • Debug underflow detection: Calling leave() at depth 0 panics.

§Usage

let mut counter = DepthCounter::with_profile(RecursionProfile::ExpressionCheck);

if !counter.enter() {
    return TypeId::ERROR; // depth exceeded
}
let result = do_work();
counter.leave();
result

Implementations§

Source§

impl DepthCounter

Source

pub const fn new(max_depth: u32) -> Self

Create a counter with an explicit max depth.

Prefer with_profile for standard use cases.

Source

pub const fn with_profile(profile: RecursionProfile) -> Self

Create a counter from a named RecursionProfile.

Only the profile’s max_depth is used (iterations are not relevant for a depth-only counter).

Source

pub const fn with_initial_depth(max_depth: u32, initial_depth: u32) -> Self

Create a counter with an initial depth already set.

Used when inheriting depth from a parent context to maintain the overall depth limit across context boundaries. The inherited depth is treated as the “base” — debug leak detection only fires if depth exceeds this base at drop time.

Source

pub const fn enter(&mut self) -> bool

Try to enter a deeper level.

Returns true if the depth limit has not been reached and entry is allowed. The caller must call leave when done.

Returns false if the depth limit has been reached. The exceeded flag is set and the depth is not incremented — do not call leave() in this case.

Source

pub fn leave(&mut self)

Leave the current depth level.

Must be called exactly once after every successful enter.

§Debug panics

In debug builds, panics if depth is already 0 (leave without enter).

Source

pub const fn depth(&self) -> u32

Current depth.

Source

pub const fn max_depth(&self) -> u32

The configured maximum depth.

Source

pub const fn is_exceeded(&self) -> bool

Returns true if the depth limit was previously exceeded.

Sticky — stays true until reset.

Source

pub const fn mark_exceeded(&mut self)

Manually mark as exceeded.

Source

pub const fn reset(&mut self)

Reset to initial state, preserving the max depth and base depth.

Trait Implementations§

Source§

impl Debug for DepthCounter

Source§

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

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

impl Drop for DepthCounter

Available on debug-assertions enabled only.
Source§

fn drop(&mut self)

Executes the destructor for this type. Read more

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> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

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

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

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, 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.
Source§

impl<S, T> Upcast<T> for S
where T: UpcastFrom<S> + ?Sized, S: ?Sized,

Source§

fn upcast(&self) -> &T
where Self: ErasableGeneric, T: ErasableGeneric<Repr = Self::Repr>,

Perform a zero-cost type-safe upcast to a wider ref type within the Wasm bindgen generics type system. Read more
Source§

fn upcast_into(self) -> T
where Self: Sized + ErasableGeneric, T: ErasableGeneric<Repr = Self::Repr>,

Perform a zero-cost type-safe upcast to a wider type within the Wasm bindgen generics type system. Read more
Source§

impl<T> WithSubscriber for T

Source§

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

fn with_current_subscriber(self) -> WithDispatch<Self>

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