Struct mycelium_kernel::shell::Command
source · 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>
impl<'cmd> Command<'cmd>
sourcepub const fn new(name: &'cmd str) -> Self
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.
sourcepub const fn with_help(self, help: &'cmd str) -> Self
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);
sourcepub const fn with_usage(self, usage: &'cmd str) -> Self
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);
sourcepub const fn with_subcommands(self, subcommands: &'cmd [Self]) -> Self
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 ...
sourcepub const fn with_fn(self, func: fn(_: Context<'_>) -> Result<'_>) -> Self
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.
sourcepub const fn with_runnable(self, run: &'cmd dyn Run) -> Self
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.
Trait Implementations§
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> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CheckedAs for T
impl<T> CheckedAs for T
source§fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
source§impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
source§fn checked_cast_from(src: Src) -> Option<Dst>
fn checked_cast_from(src: Src) -> Option<Dst>
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
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)
fn as_any(&self) -> &(dyn Any + 'static)
&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)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.