Skip to main content

StdioProvider

Struct StdioProvider 

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

A ContextProvider backed by a child process over stdio.

Handshakes once on construction, caches the negotiated identity + capabilities, then splits the connection into independently-lockable halves: the write half (stdin) is locked only for the length of one line write, a dedicated reader task owns the read half and demultiplexes replies on their correlation id, and a [StdioControl] holds the child for teardown. A provider that negotiated Capabilities::correlation can therefore have several querys in flight at once — a slow one no longer head-of-line blocks the rest. A provider that did not negotiate correlation, and every verify (whose envelopes carry no id and so cannot be demultiplexed), stay strictly lock-step via no_id_lock, behaving exactly as the single-mutex transport did before (ADR 0002).

Implementations§

Source§

impl StdioProvider

Source

pub async fn spawn( id: impl Into<String>, program: &str, args: &[String], ) -> Result<Self, HostError>

Spawn a child-process provider, complete the handshake, and cache its declared identity + capabilities. id is the host-facing routing and consent key. Fails cleanly (killing the child) on a bad or incompatible handshake. On success the connection is split and the reader task launched, so replies can be demultiplexed from here on.

Trait Implementations§

Source§

impl ContextProvider for StdioProvider

Source§

fn id(&self) -> &str

The provider’s host-facing id — its routing key and its consent key (SPEC.md §4 and §10).
Source§

fn info(&self) -> &ProviderInfo

Identity + declared data-flow direction, surfaced at consent time (SPEC.md §3, ).
Source§

fn capabilities(&self) -> &Capabilities

Capabilities negotiated at the handshake (SPEC.md §3) — which frame kinds and filters this provider serves, whether it upserts, does graph, is an embedder, or supports subscriptions.
Source§

fn query<'life0, 'life1, 'async_trait>( &'life0 self, query: &'life1 ContextQuery, ) -> Pin<Box<dyn Future<Output = Result<ContextQueryResult, HostError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Answer a context query with budgeted, provenance-carrying frames (SPEC.md §5). The host — not the provider — enforces the budget and consent; a provider that over-runs its budget is caught by the host, not trusted (crate::host).
Source§

fn verify<'life0, 'life1, 'async_trait>( &'life0 self, request: &'life1 VerifyRequest, ) -> Pin<Box<dyn Future<Output = Result<VerifyResponse, HostError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Revalidate frames the host already holds, without any frame body travelling (docs/context-reuse.md §4 context/verify). Read more
Source§

fn shutdown<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<(), HostError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Shut the provider down cleanly (SPEC.md §3 lifecycle). In-process providers default to a no-op; transport-backed providers send shutdown and reap their child. Overridable.
Source§

impl Drop for StdioProvider

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. 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> 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> 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 = 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