pub struct Command<'cmd> { /* private fields */ }
Expand description

Defines a shell command, including its name, help text, and how the command is executed.

Implementations§

source§

impl<'cmd> Command<'cmd>

source

pub const fn new(name: &'cmd str) -> Self

Constructs a new Command with the given name.

By default, this command will have no help text, no subcommands, no usage hints, and do nothing. Use the Command::with_help and Command::with_usage to add help text to the command. Use Command::with_subcommands to add subcommands, and/or Command::with_fn or Command::with_runnable to add a function that defines how to execute the command.

source

pub const fn with_help(self, help: &'cmd str) -> Self

Add help text to the command.

This should define what the command does, and is printed when running help commands.

Examples
use mycelium_kernel::shell::Command;

const DUMP: Command = Command::new("dump")
    .with_help("print formatted representations of a kernel structure");

// The shell will format this command's help text as:
let help_text = "dump --- print formatted representations of a kernel structure";
assert_eq!(format!("{DUMP}"), help_text);
source

pub const fn with_usage(self, usage: &'cmd str) -> Self

Add usage text to the command.

This should define what, if any, arguments the command takes. If the command does not take any arguments, it is not necessary to call this method.

Examples
use mycelium_kernel::shell::Command;

const ECHO: Command = Command::new("echo")
    .with_help("print the provided text")
    .with_usage("<TEXT>");

// The shell will format this command's help text as:
let help_text = "echo <TEXT> --- print the provided text";
assert_eq!(format!("{ECHO}"), help_text);
source

pub const fn with_subcommands(self, subcommands: &'cmd [Self]) -> Self

Add a list of subcommands to this command.

If subcommands are added, they will be handled automatically by checking if the next argument matches the name of a subcommand, before calling the command’s function or runnable, if it has one.

If the next argument matches the name of a subcommand, that subcommand will be automatically executed. If it does not match a subcommand, and the command has a function or runnable, that function or runnable will be called with the remainder of the input. If the command does not have a function or runnable, a “subcommand expected” error is returned.

Examples

A command with only subcommands, and no root function/runnable:

use mycelium_kernel::shell::Command;

// let's pretend we're implementing git (inside the mycelium kernel? for
// some reason????)...
const GIT: Command = Command::new("git")
    .with_subcommands(&[
        SUBCMD_ADD,
        SUBCMD_COMMIT,
        SUBCMD_PUSH,
        // more git commands ...
    ]);

const SUBCMD_ADD: Command = Command::new("add")
    .with_help("add file contents to the index")
    .with_fn(|ctx| {
        // ...
    });
const SUBCMD_COMMIT: Command = Command::new("commit")
    .with_help("record changes to the repository")
    .with_fn(|ctx| {
        // ...
    });
const SUBCMD_PUSH: Command = Command::new("push")
    .with_help("update remote refs along with associated objects")
    .with_fn(|ctx| {
        // ...
    });
// more git commands ...
source

pub const fn with_fn(self, func: fn(_: Context<'_>) -> Result<'_>) -> Self

Add a function that’s run to execute this command.

If Command::with_fn or Command::with_runnable was previously called, this overwrites the previously set value.

source

pub const fn with_runnable(self, run: &'cmd dyn Run) -> Self

Add a runnable item that’s run to execute this command.

If Command::with_fn or Command::with_runnable was previously called, this overwrites the previously set value.

source

pub fn run<'ctx>(&'cmd self, ctx: Context<'ctx>) -> Result<'ctx>
where 'cmd: 'ctx,

Run this command in the provided Context.

Trait Implementations§

source§

impl<'cmd> Debug for Command<'cmd>

source§

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

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

impl Display for Command<'_>

source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'cmd> !RefUnwindSafe for Command<'cmd>

§

impl<'cmd> Send for Command<'cmd>

§

impl<'cmd> Sync for Command<'cmd>

§

impl<'cmd> Unpin for Command<'cmd>

§

impl<'cmd> !UnwindSafe for Command<'cmd>

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

source§

fn az<Dst>(self) -> Dst
where T: Cast<Dst>,

Casts the value.
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<Src, Dst> CastFrom<Src> for Dst
where Src: Cast<Dst>,

source§

fn cast_from(src: Src) -> Dst

Casts the value.
source§

impl<T> CheckedAs for T

source§

fn checked_as<Dst>(self) -> Option<Dst>
where T: CheckedCast<Dst>,

Casts the value.
source§

impl<Src, Dst> CheckedCastFrom<Src> for Dst
where Src: CheckedCast<Dst>,

source§

fn checked_cast_from(src: Src) -> Option<Dst>

Casts the value.
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

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

source§

fn overflowing_as<Dst>(self) -> (Dst, bool)
where T: OverflowingCast<Dst>,

Casts the value.
source§

impl<Src, Dst> OverflowingCastFrom<Src> for Dst
where Src: OverflowingCast<Dst>,

source§

fn overflowing_cast_from(src: Src) -> (Dst, bool)

Casts the value.
source§

impl<T> SaturatingAs for T

source§

fn saturating_as<Dst>(self) -> Dst
where T: SaturatingCast<Dst>,

Casts the value.
source§

impl<Src, Dst> SaturatingCastFrom<Src> for Dst
where Src: SaturatingCast<Dst>,

source§

fn saturating_cast_from(src: Src) -> Dst

Casts the value.
source§

impl<T> ToString for T
where T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

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>,

§

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

source§

fn unwrapped_as<Dst>(self) -> Dst
where T: UnwrappedCast<Dst>,

Casts the value.
source§

impl<Src, Dst> UnwrappedCastFrom<Src> for Dst
where Src: UnwrappedCast<Dst>,

source§

fn unwrapped_cast_from(src: Src) -> Dst

Casts the value.
§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
source§

impl<T> WrappingAs for T

source§

fn wrapping_as<Dst>(self) -> Dst
where T: WrappingCast<Dst>,

Casts the value.
source§

impl<Src, Dst> WrappingCastFrom<Src> for Dst
where Src: WrappingCast<Dst>,

source§

fn wrapping_cast_from(src: Src) -> Dst

Casts the value.