Skip to main content

Trace

Struct Trace 

Source
pub struct Trace<T>(/* private fields */);
Expand description

A stack-like structure to hold the module backtrace during evaluation.

A module trace is to the evaluator what Backtrace is to a program. In the trace, modules are stored in import-order. This means that the module where the error was caused is always the last one in the trace.

Implementations§

Source§

impl<T> Trace<T>

Source

pub const fn empty() -> Self

Create a new empty Trace.

Source

pub fn len(&self) -> usize

Get the number of modules in the trace.

Source

pub fn is_empty(&self) -> bool

Check whether the trace is empty.

Source

pub fn current(&self) -> Option<&T>

Get a reference to the current module.

The current module is always the one that was pushed last. Returns None if the trace is empty.

Source

pub fn push(&mut self, id: T)

Add a module to the trace.

Pushing a module makes that module the “deepest” level of the trace. See: Trace.

§Example
let mut trace = Trace::empty();
trace.push("module 1");
trace.push("module 2");
trace.push("module 3");

assert_eq!(
    trace.iter().copied().collect::<Vec<_>>(),
    &[
        "module 1",
        "module 2",
        "module 3"
    ]
);
Source

pub fn pop(&mut self) -> Option<T>

Remove the last module from the trace and return it.

Also see: push.

§Example
let mut trace = Trace::empty();
trace.push("module 1");
trace.push("module 2");
trace.push("module 3");

assert_eq!(trace.pop(), Some("module 3"));
assert_eq!(trace.pop(), Some("module 2"));
assert_eq!(trace.pop(), Some("module 1"));
assert_eq!(trace.pop(), None);
Source

pub fn iter(&self) -> Iter<'_, T>

Get an iterator over all modules in the trace.

The returned iterator traverses the trace from the deepest module to the shallowest. The returned iterator implements DoubleEndedIterator so you can use Iterator::rev.

§Example
let mut trace = Trace::empty();
trace.push("module 1");
trace.push("module 2");
trace.push("module 3");

let mut iter = trace.iter();
assert_eq!(iter.next().copied(), Some("module 1"));
assert_eq!(iter.next().copied(), Some("module 2"));
assert_eq!(iter.next().copied(), Some("module 3"));
assert_eq!(iter.next().copied(), None);

Trait Implementations§

Source§

impl<T: Clone> Clone for Trace<T>

Source§

fn clone(&self) -> Trace<T>

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<T: Debug> Debug for Trace<T>

Source§

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

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

impl<T> Default for Trace<T>

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl<T> From<Trace<T>> for Vec<T>

Source§

fn from(x: Trace<T>) -> Self

Converts to this type from the input type.
Source§

impl<T> From<Vec<T>> for Trace<T>

Source§

fn from(x: Vec<T>) -> Self

Converts to this type from the input type.
Source§

impl<'a, T> IntoIterator for &'a Trace<T>

Source§

type Item = &'a T

The type of the elements being iterated over.
Source§

type IntoIter = Iter<'a, T>

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more

Auto Trait Implementations§

§

impl<T> Freeze for Trace<T>

§

impl<T> RefUnwindSafe for Trace<T>
where T: RefUnwindSafe,

§

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

§

impl<T> Sync for Trace<T>
where T: Sync,

§

impl<T> Unpin for Trace<T>
where T: Unpin,

§

impl<T> UnsafeUnpin for Trace<T>

§

impl<T> UnwindSafe for Trace<T>
where T: UnwindSafe,

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.

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