Skip to main content

StdioBuilder

Struct StdioBuilder 

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

Builds a stdio server and serves it on this process’s stdin and stdout.

The one-call form is Server::serve_stdio; this type exists for the case where the caller needs to change one of the two things that are genuinely decisions — the revision ceiling, or the framing limits.

§Examples

let mut loop_ = StdioBuilder::new(Server::builder("greeter").build())
    .version(ProtocolVersion::V2025_06_18)
    .build();
let report = loop_.serve().await?;
eprintln!("{report:?}");

Implementations§

Source§

impl StdioBuilder

Source

pub fn new(server: Server) -> Self

A builder serving server over stdio.

Source

pub fn auth(self, auth: AuthContext) -> Self

The principal this server’s peer acts as.

A stdio peer is the child process on the other end of a pipe, and there is nothing on a pipe to authenticate — no header, no token, no TLS peer identity. So unlike the HTTP transports, where the principal arrives with the request, here the deployment declares it and the crate holds it for the life of the session.

Needed because the alternative is unreachable rather than merely inconvenient: a scope-gated tool is invisible to an anonymous session (RegistryServer::call and the listing paths both read ctx.peer().auth()), so a stdio server that registers a Write-scoped tool could never serve it, and no setting existed that could change that. This method is that setting.

Defaults to AuthContext::anonymous, so a stdio server that says nothing serves exactly the primitives nobody had to authorise. Note the one lifetime difference from HTTP: this principal covers the whole connection, because there is no per-request credential here to differ from.

§Examples
use protocol_droid::application::server::{Server, serve::StdioBuilder};
use protocol_droid::domain::registry::{AuthContext, Scope, ScopeSet};

let server = Server::builder("greeter").build();
let trusted = StdioBuilder::new(server)
    .auth(AuthContext::new("local", ScopeSet::empty().with(Scope::Write)));
Source

pub const fn version(self, version: ProtocolVersion) -> Self

The newest revision this session is permitted to use before a peer says otherwise.

This is a ceiling, not an answer. The revision a peer is told in its handshake is settled from its own initialize; this only decides what the session gates on in the moment before that, and what it falls back to for a peer that never sent one.

Defaults to the newest revision with a handshake defined. The obvious alternative — the newest revision the crate knows — is 2026-07-28, which SEP-2575 removed initialize from, so a server that chose it would gate its whole life on a revision no peer can complete.

Source

pub const fn config(self, config: StdioConfig) -> Self

The framing limits: frame ceiling and diagnostics writer.

Source

pub fn build(self) -> ServeLoop<Stdin, Stdout, Stderr, ProfileBatching>

Assembles the loop this builder describes.

Infallible: everything it needs is either in self or derived from it by resolve, which is a pure function over a Negotiation this builder constructs itself.

Trait Implementations§

Source§

impl Debug for StdioBuilder

Source§

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

Formats the value using the given formatter. 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> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,

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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

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