Skip to main content

RuntimeCommandSpec

Struct RuntimeCommandSpec 

Source
#[non_exhaustive]
pub struct RuntimeCommandSpec { pub spec: CommandSpec, pub handler: CommandHandler, pub streaming_handler: Option<StreamingCommandHandler>, }
Expand description

Executable leaf command.

RuntimeCommandSpec pairs a CommandSpec with async business logic. This split keeps metadata inspectable for help/search/schema generation before the handler ever runs.

Use RuntimeCommandSpec::new_streaming for commands that emit incremental NDJSON progress events (e.g. long-running deployments with --follow).

Construct with one of the new* constructors — never as a struct literal. Literal construction would bypass the handles_dry_run/handler-shape misuse checks those constructors debug-assert. #[non_exhaustive] also means the engine can add fields without a breaking release.

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§spec: CommandSpec

Declarative command metadata.

§handler: CommandHandler

Async command implementation.

§streaming_handler: Option<StreamingCommandHandler>

Optional streaming handler. When set, the engine writes NDJSON events to stdout as they arrive instead of collecting a single envelope.

Implementations§

Source§

impl RuntimeCommandSpec

Source

pub fn new<F, Fut, Output>(spec: CommandSpec, handler: F) -> Self
where F: Fn(CredentialResolver, ValueMap) -> Fut + Send + Sync + 'static, Fut: Future<Output = Result<Output>> + Send + 'static, Output: Into<CommandResult> + Send + 'static,

Creates a runtime command with the common handler shape.

The handler receives a lazy CredentialResolver and the effective args. Call resolver.resolve().await? only when the command actually needs a credential; commands that ignore it never trigger an auth flow. The handler returns CommandResult, where data must be JSON-serializable.

This handler shape has no CommandContext, so it can never call CommandContext::dry_run — do not pair this with CommandSpec::handles_dry_run (debug-asserted; see that field’s docs).

Source

pub fn new_with_context<F, Fut, Output>(spec: CommandSpec, handler: F) -> Self
where F: Fn(CommandContext) -> Fut + Send + Sync + 'static, Fut: Future<Output = Result<Output>> + Send + 'static, Output: Into<CommandResult> + Send + 'static,

Creates a runtime command with the full invocation context.

Source

pub fn new_streaming<F, Fut>(spec: CommandSpec, handler: F) -> Self
where F: Fn(CommandContext, StreamSender) -> Fut + Send + Sync + 'static, Fut: Future<Output = Result<()>> + Send + 'static,

Creates a streaming command that emits NDJSON events to stdout.

The handler receives context and a StreamSender. It should call sender.send(event).await for each progress event, then return Ok(()). The engine writes each event as a JSON line; stdout is flushed after each.

Source

pub fn new_typed<T, F, Fut, Output>(spec: CommandSpec, handler: F) -> Self
where T: FromArgMatches + Send + 'static, F: Fn(CredentialResolver, T) -> Fut + Send + Sync + 'static, Fut: Future<Output = Result<Output>> + Send + 'static, Output: Into<CommandResult> + Send + 'static,

Creates a runtime command with typed argument deserialization.

The handler receives a lazy CredentialResolver and the deserialized args struct. Use with CommandSpec::from_args::<T>() to get end-to-end type safety from argument definition through handler consumption.

If the handler also needs the command path, middleware, or user-supplied args, use RuntimeCommandSpec::new_typed_with_context (or RuntimeCommandSpec::new_with_context with CommandContext::typed_args) instead.

This handler shape has no CommandContext, so it can never call CommandContext::dry_run — do not pair this with CommandSpec::handles_dry_run (debug-asserted; see that field’s docs).

Source

pub fn new_typed_with_context<T, F, Fut, Output>( spec: CommandSpec, handler: F, ) -> Self
where T: FromArgMatches + Send + 'static, F: Fn(CommandContext, T) -> Fut + Send + Sync + 'static, Fut: Future<Output = Result<Output>> + Send + 'static, Output: Into<CommandResult> + Send + 'static,

Creates a runtime command with full context and typed argument deserialization.

Combines new_with_context’s access to CommandContext (command path, middleware snapshot, user-supplied args, CommandContext::dry_run) with new_typed’s automatic deserialization: the engine parses T from the raw matches before invoking the handler, so the handler never needs to call CommandContext::typed_args itself.

Use this instead of new_with_context + context.typed_args::<T>() when a command needs full context and wants eager, guaranteed-parsed typed args rather than parsing on demand. Because the handler receives a CommandContext, this is a valid pairing with CommandSpec::handles_dry_run.

§Errors

The returned handler surfaces a CliCoreError::Message if T fails to deserialize from the parsed matches (this should not happen for args generated by CommandSpec::from_args::<T>(), since clap already validated them during parsing).

Source

pub fn new_typed_streaming<T, F, Fut>(spec: CommandSpec, handler: F) -> Self
where T: FromArgMatches + Send + 'static, F: Fn(CommandContext, T, StreamSender) -> Fut + Send + Sync + 'static, Fut: Future<Output = Result<()>> + Send + 'static,

Creates a streaming command with full context and typed argument deserialization.

Combines new_streaming’s NDJSON event emission with new_typed’s automatic deserialization: the engine parses T from the raw matches before invoking the handler.

§Errors

The returned handler surfaces a CliCoreError::Message if T fails to deserialize from the parsed matches.

Trait Implementations§

Source§

impl Clone for RuntimeCommandSpec

Source§

fn clone(&self) -> RuntimeCommandSpec

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
Source§

impl Debug for RuntimeCommandSpec

Source§

fn fmt(&self, formatter: &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<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> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. 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: 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> 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 = !

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