Skip to main content

ScopedToolRegistry

Struct ScopedToolRegistry 

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

LIFO scoped tool registry with shadow-stack semantics.

Wraps a base ToolRegistry with a stack of scopes. Tools in higher scopes shadow identically-named tools in lower scopes. Popping a scope removes all its tools and restores shadows.

The scope stack is protected by a Mutex for interior mutability, enabling push/pop through &self. The base registry is lock-free.

Implementations§

Source§

impl ScopedToolRegistry

Source

pub fn new(base: ToolRegistry) -> Self

Creates a new scoped registry with the given base.

The base registry provides tools at the lowest resolution level.

Source

pub fn push_scope(&self) -> ScopeId

Pushes a new empty scope onto the stack and returns its ScopeId.

Source

pub fn pop_scope(&self, id: ScopeId) -> bool

Pops the given scope from the stack.

Returns true if the scope was found and removed, false if it was not the top scope or does not exist. Only the topmost scope can be popped — attempting to pop a non-top scope is a no-op.

Source

pub fn register_in_scope<T: Tool + 'static>( &self, scope: ScopeId, tool: T, ) -> Result<Option<Arc<dyn Tool>>, T>

Registers a tool in the specified scope.

If a tool with the same name already exists in that scope, it is replaced and the old tool is returned. Tools in other scopes or the base registry are not affected — they are simply shadowed.

§Errors

Returns the tool back if the scope does not exist.

Source

pub fn register_arc_in_scope( &self, scope: ScopeId, name: String, tool: Arc<dyn Tool>, ) -> Result<Option<Arc<dyn Tool>>, (String, Arc<dyn Tool>)>

Registers an already-Arc’d tool in the specified scope.

Returns Ok(old) if the scope exists, or Err((name, tool)) if not.

§Errors

Returns Err((name, tool)) when the requested scope does not exist in the layer stack. The returned tuple lets the caller recover the name and Arc’d tool without an extra allocation.

Source

pub fn get(&self, name: &str) -> Option<Arc<dyn Tool>>

Returns a tool by searching from top scope to base.

Source

pub fn specs(&self) -> Vec<ToolSpec>

Generates merged ToolSpecs from all scopes and base, sorted alphabetically by tool name.

Tools in higher scopes shadow those with the same name in lower scopes or the base. The returned list contains one entry per unique tool name.

The sorted output ensures deterministic prompt caching across turns and provider calls.

Source

pub fn scope_depth(&self) -> usize

Returns the number of active scopes.

Source

pub fn base(&self) -> &ToolRegistry

Returns a reference to the base registry.

Source

pub fn base_mut(&mut self) -> &mut ToolRegistry

Returns a mutable reference to the base registry.

Source

pub fn unregister_from_base(&self, name: &str) -> Option<Arc<dyn Tool>>

Removes a tool from the base registry by name.

Source

pub fn len(&self) -> usize

Returns the total number of unique tools visible (base + all scopes).

Source

pub fn is_empty(&self) -> bool

Returns true if no tools are visible at all.

Source

pub async fn execute(&self, call: &ToolCall) -> ToolResult<ToolOutput>

Executes a tool call using the merged tool view.

This delegates to the first matching tool from top scope to base.

§Errors

Returns ToolError::NotFound when the tool is not in any scope or the base.

Source

pub fn push_scope_guarded(self: &Arc<Self>) -> ScopeGuard

Pushes a new scope and returns a RAII guard that pops it on drop.

This is the preferred way to manage scope lifetimes. The returned ScopeGuard automatically calls pop_scope when dropped, ensuring cleanup even in the presence of early returns or panics.

Trait Implementations§

Source§

impl Clone for ScopedToolRegistry

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

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<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> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

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> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + 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
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + 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> 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 = 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<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