Skip to main content

ProcessingStack

Struct ProcessingStack 

Source
pub struct ProcessingStack<I> { /* private fields */ }
Expand description

The chain of remote context URLs currently being processed.

This is the specification’s remote contexts array. It serves two purposes: spotting a context that includes itself, and bounding the length of a remote context chain at MAX_REMOTE_CONTEXTS. Whether it is empty also tells the algorithm whether the context being processed came from a remote document, which is what decides if its @base entry applies.

Implemented as an immutable singly-linked list behind Arcs, so the copy each recursive call receives is a pointer bump rather than a clone of the chain.

Every copy of a stack also shares one record of the contexts dereferenced since the stack was created, which is how one run of the algorithm honours step 5.2.4: “If context was previously dereferenced, then the processor MUST NOT do a further dereference”. The chain is per branch of the recursion; the record is per run.

Implementations§

Source§

impl<I> ProcessingStack<I>

Source

pub fn new() -> Self

Creates an empty stack, meaning no remote context is being processed, with an empty record of dereferenced contexts.

Source

pub fn is_empty(&self) -> bool

Checks whether no remote context has been entered, i.e. the context being processed is not itself remote.

Source

pub fn len(&self) -> usize

Returns the number of remote contexts on the stack.

Walks the chain, so this is linear in the stack depth.

Source

pub fn cycle(&self, url: &I) -> bool
where I: PartialEq,

Checks whether url is already on the stack, meaning entering it would close a loop.

Source

pub fn push(&mut self, url: I) -> bool
where I: PartialEq,

Pushes url onto the stack, unless it is already there.

Returns true when the URL was added, and false when it was already on the stack and nothing changed. What false means is version-dependent: JSON-LD 1.0 treats it as a recursive context inclusion error, while 1.1 skips the context only while validating a scoped context (step 5.2.2) and otherwise processes it again, which is Self::enter.

Source

pub fn enter(&mut self, url: I)

Pushes url onto the stack whether or not it is already there.

This is step 5.2.3’s “add context to remote contexts”: under JSON-LD 1.1 a context named again outside scoped-context validation is processed again, and each processing counts toward MAX_REMOTE_CONTEXTS.

Source

pub fn dereferenced(&self, url: &I) -> Option<Arc<Context>>
where I: Eq + Hash,

The @context of the document dereferenced for url earlier in this run, if there was one (step 5.2.4).

Source

pub fn remember_dereferenced(&self, url: I, context: Arc<Context>)
where I: Eq + Hash,

Records the @context dereferenced for url, so the rest of this run reuses it instead of dereferencing url again (step 5.2.4).

Trait Implementations§

Source§

impl<I> Clone for ProcessingStack<I>

Source§

fn clone(&self) -> Self

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<I> Default for ProcessingStack<I>

Source§

fn default() -> Self

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

Auto Trait Implementations§

§

impl<I> !RefUnwindSafe for ProcessingStack<I>

§

impl<I> !UnwindSafe for ProcessingStack<I>

§

impl<I> Freeze for ProcessingStack<I>
where Option<Arc<StackNode<I>>>: Freeze, Arc<Mutex<RawMutex, HashMap<I, Arc<Context>>>>: Freeze,

§

impl<I> Send for ProcessingStack<I>
where Option<Arc<StackNode<I>>>: Send, Arc<Mutex<RawMutex, HashMap<I, Arc<Context>>>>: Send,

§

impl<I> Sync for ProcessingStack<I>
where Option<Arc<StackNode<I>>>: Sync, Arc<Mutex<RawMutex, HashMap<I, Arc<Context>>>>: Sync,

§

impl<I> Unpin for ProcessingStack<I>
where Option<Arc<StackNode<I>>>: Unpin, Arc<Mutex<RawMutex, HashMap<I, Arc<Context>>>>: Unpin,

§

impl<I> UnsafeUnpin for ProcessingStack<I>

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

Source§

fn as_unordered(&self) -> &Unordered<T>

Views this value as an Unordered reference.
Source§

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

Source§

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

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, C> FromWithContext<T, C> for T

Source§

fn from_with(value: T, _context: &C) -> T

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, C> IntoWithContext<U, C> for T
where U: FromWithContext<T, C>,

Source§

fn into_with(self, context: &C) -> U

Source§

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

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 = !

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

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U, C> TryFromWithContext<U, C> for T
where U: IntoWithContext<T, C>,

Source§

type Error = !

Source§

fn try_from_with( value: U, context: &C, ) -> Result<T, <T as TryFromWithContext<U, C>>::Error>

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<T, U, C> TryIntoWithContext<U, C> for T
where U: TryFromWithContext<T, C>,

Source§

type Error = <U as TryFromWithContext<T, C>>::Error

Source§

fn try_into_with( self, context: &C, ) -> Result<U, <T as TryIntoWithContext<U, C>>::Error>

Source§

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

Source§

fn with<C>(&self, context: C) -> Contextual<&T, C>

Source§

fn into_with<C>(self, context: C) -> Contextual<T, C>
where T: Sized,