Skip to main content

StandardRequest

Enum StandardRequest 

Source
pub enum StandardRequest<T = Value>{
    Confirm {
        message: String,
        default: Option<bool>,
    },
    Prompt {
        message: String,
        default: Option<T>,
        placeholder: Option<String>,
    },
    Select {
        message: String,
        options: Vec<SelectOption<T>>,
        multi_select: bool,
    },
    Custom {
        data: T,
    },
}
Expand description

Standard request types for common interactive UI patterns.

These request types cover the most common server-to-client interactions:

  • Confirm: Yes/no questions before important actions
  • Prompt: Free-form text input from the user
  • Select: Choose one or more options from a list
  • Custom: Domain-specific request payload

The type parameter T defaults to serde_json::Value for backwards compatibility. Use a custom type for domain-specific interactions.

For domain-specific interactions (e.g., image quality selection, custom dialogs), define your own request/response enums and use BidirChannel<YourRequest, YourResponse>.

§Wire Format

Uses internally-tagged JSON (#[serde(tag = "type")]):

// Confirm request
{
  "type": "confirm",
  "message": "Delete 3 files?",
  "default": false
}

// Prompt request
{
  "type": "prompt",
  "message": "Enter project name:",
  "default": "my-project",
  "placeholder": "project-name"
}

// Select request
{
  "type": "select",
  "message": "Choose template:",
  "options": [
    { "value": "minimal", "label": "Minimal", "description": "Bare-bones starter" },
    { "value": "full", "label": "Full Featured" }
  ],
  "multiSelect": false
}

§Client Implementation

Clients should display appropriate UI for each request type:

TypeUI Suggestion
confirmYes/No buttons or checkbox
promptText input field
selectDropdown, radio buttons, or checkbox list
customApplication-defined

Variants§

§

Confirm

Binary yes/no confirmation request.

Use this for important decisions like:

  • Confirming destructive operations (“Delete 3 files?”)
  • Proceeding with potentially expensive operations
  • Accepting terms or conditions

The default field suggests the default choice if the user doesn’t explicitly respond (e.g., just presses Enter).

Fields

§message: String

Question to ask the user. Should be a clear yes/no question.

§default: Option<bool>

Default answer if user accepts without explicit choice.

  • Some(true) = default to “yes”
  • Some(false) = default to “no”
  • None = require explicit choice
§

Prompt

Free-form text input request.

Use this for collecting:

  • Names, titles, identifiers
  • Paths, URLs
  • Custom values not in a predefined list

For password/sensitive input, clients should use appropriate input masking.

Fields

§message: String

Prompt message shown to the user.

§default: Option<T>

Default value to pre-fill in the input. User can accept or modify.

§placeholder: Option<String>

Placeholder text shown when input is empty. Provides a hint about expected format.

§

Select

Selection request for choosing from options.

Use this when the valid choices are known ahead of time. Supports both single and multiple selection.

§Example

let options = vec![
    SelectOption::new("dev", "Development")
        .with_description("Local dev environment"),
    SelectOption::new("prod", "Production")
        .with_description("Live servers"),
];
let selected = ctx.select("Choose environment:", options).await?;

Fields

§message: String

Selection prompt shown to the user.

§options: Vec<SelectOption<T>>

Available options to choose from. Each option has a value (returned) and label (displayed).

§multi_select: bool

Whether to allow selecting multiple options.

  • false (default): single selection, returns one value
  • true: multiple selection, returns zero or more values
§

Custom

Custom domain-specific request payload.

Use this for application-specific interactions that don’t fit the standard confirm/prompt/select patterns.

Fields

§data: T

The custom request data.

Trait Implementations§

Source§

impl<T> Clone for StandardRequest<T>

Source§

fn clone(&self) -> StandardRequest<T>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T> Debug for StandardRequest<T>

Source§

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

Formats the value using the given formatter. Read more
Source§

impl<'de, T> Deserialize<'de> for StandardRequest<T>

Source§

fn deserialize<__D>( __deserializer: __D, ) -> Result<StandardRequest<T>, <__D as Deserializer<'de>>::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl<T> JsonSchema for StandardRequest<T>

Source§

fn schema_name() -> Cow<'static, str>

The name of the generated JSON Schema. Read more
Source§

fn schema_id() -> Cow<'static, str>

Returns a string that uniquely identifies the schema produced by this type. Read more
Source§

fn json_schema(generator: &mut SchemaGenerator) -> Schema

Generates a JSON Schema for this type. Read more
Source§

fn inline_schema() -> bool

Whether JSON Schemas generated for this type should be included directly in parent schemas, rather than being re-used where possible using the $ref keyword. Read more
Source§

impl<T> PartialEq for StandardRequest<T>

Source§

fn eq(&self, other: &StandardRequest<T>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<T> Serialize for StandardRequest<T>

Source§

fn serialize<__S>( &self, __serializer: __S, ) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl<T> StructuralPartialEq for StandardRequest<T>

Auto Trait Implementations§

§

impl<T> Freeze for StandardRequest<T>
where T: Freeze,

§

impl<T> RefUnwindSafe for StandardRequest<T>
where T: RefUnwindSafe,

§

impl<T> Send for StandardRequest<T>
where T: Send,

§

impl<T> Sync for StandardRequest<T>
where T: Sync,

§

impl<T> Unpin for StandardRequest<T>
where T: Unpin,

§

impl<T> UnsafeUnpin for StandardRequest<T>
where T: UnsafeUnpin,

§

impl<T> UnwindSafe for StandardRequest<T>
where T: UnwindSafe,

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

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

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

Source§

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

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> MaybeSend for T
where T: Send,