Skip to main content

Shadow

Struct Shadow 

Source
pub struct Shadow<P> { /* private fields */ }
Expand description

Approval policy created by shadow.

Implementations§

Source§

impl<P> Shadow<P>

Source

pub fn enforcement(self, enforcement: Enforcement) -> Self

Sets whether decisions are enforced (default: observe only).

Source

pub fn on_decision<F, Fut>(self, observer: F) -> Self
where F: Fn(PolicyDecisionEvent) -> Fut + Send + Sync + 'static, Fut: Future + Send + 'static,

Registers an asynchronous decision observer, replacing any prior observer.

The observer runs independently on the current Tokio runtime; its output and task panics are ignored so auditing cannot change approval. Without a Tokio runtime the event is skipped. Dropping the policy cancels unfinished observers; call Self::flush_decisions to drain queued events first.

§Examples
use ferrin_core::generate_text::ApprovalStatus;
use ferrin_policy::shadow;

let policy = shadow(ApprovalStatus::denied()).on_decision(|event| async move {
    assert!(!event.enforced);
    assert_eq!(event.effective, ApprovalStatus::approved());
});
Source

pub fn on_decision_sync( self, observer: impl Fn(&ParsedToolCall, Option<&ApprovalStatus>) + Send + Sync + 'static, ) -> Self

Registers a synchronous low-level observer, replacing any prior observer.

This Ferrin extension receives the raw optional status and blocks approval until it returns. Unwinding observer panics are ignored. Prefer Self::on_decision for normalized events and independent execution.

Source

pub async fn flush_decisions(&self)

Waits for audit callbacks queued before this call took their task set.

Concurrent approval resolution can queue new events without waiting for this flush. Cancelling the flush cancels the callbacks it took ownership of.

Trait Implementations§

Source§

impl<P: ApprovalPolicy> ApprovalPolicy for Shadow<P>

Source§

fn resolve<'a>( &'a self, call: &'a ParsedToolCall, ctx: ApprovalContext<'a>, ) -> BoxFuture<'a, Option<ApprovalStatus>>

Resolves the approval status of call.
Source§

impl<P> Debug for Shadow<P>

Source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<P> !Freeze for Shadow<P>

§

impl<P> !RefUnwindSafe for Shadow<P>

§

impl<P> !UnwindSafe for Shadow<P>

§

impl<P> Send for Shadow<P>
where P: Send,

§

impl<P> Sync for Shadow<P>
where P: Sync,

§

impl<P> Unpin for Shadow<P>
where P: Unpin,

§

impl<P> UnsafeUnpin for Shadow<P>
where P: UnsafeUnpin,

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

Source§

type Output = T

Should always be Self
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> 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