#![deny(warnings, missing_docs)]
#![cfg_attr(docsrs, feature(doc_cfg))]
#![doc = include_str!("../README.md")]
pub mod builder;
pub mod error;
mod runtime;
pub use runtime::*;
pub mod run;
mod prelude;
pub use clier_parser::Argv;
use std::env::args;
#[derive(Debug, Default, Clone)]
pub struct MissingMeta;
#[derive(Debug, Clone)]
pub struct HasMeta(pub CliMeta);
#[derive(Debug, Clone)]
pub struct NotRunnable;
#[derive(Debug, Clone)]
pub struct Runnable(pub Box<[Commands]>);
#[derive(Clone, Debug, Default)]
pub struct Clier<T, R> {
pub(crate) cli_meta: T,
pub(crate) registered_commands: R,
pub args: Argv,
}
#[derive(Clone, Debug, Default)]
pub struct CliMeta {
pub name: String,
pub description: String,
pub version: Option<String>,
pub usage: Option<String>,
}
impl CliMeta {
pub fn new(name: String, description: String) -> Self {
Self { name, description, version: None, usage: None }
}
pub fn version(mut self, version: impl Into<String>) -> Self {
self.version = Some(version.into());
self
}
pub fn usage(mut self, usage: impl Into<String>) -> Self {
self.version = Some(usage.into());
self
}
}
#[derive(Debug, Clone)]
pub struct CmdMeta {
pub name: String,
pub description: String,
}
impl CmdMeta {
pub fn new(name: &str, description: &str) -> Self {
CmdMeta { name: name.into(), description: description.into() }
}
}
#[derive(Debug, Clone)]
pub struct CmdCollection {
pub meta: CmdMeta,
pub children: Box<[Commands]>,
}
#[derive(Debug, Clone)]
pub enum Commands {
Command {
meta: CmdMeta,
handler: fn(clier: Clier<HasMeta, Runnable>) -> crate::run::ExitCode,
},
Collection(CmdCollection),
}
impl Clier<HasMeta, NotRunnable> {
pub fn runnable(self, cmds: Vec<Commands>) -> Clier<HasMeta, Runnable> {
Clier { args: self.args, cli_meta: self.cli_meta, registered_commands: Runnable(cmds.into()) }
}
}
impl Clier<MissingMeta, NotRunnable> {
pub fn meta(self, meta: CliMeta) -> Clier<HasMeta, NotRunnable> {
Clier {
args: self.args,
cli_meta: HasMeta(meta),
registered_commands: self.registered_commands,
}
}
pub fn parse() -> Clier<MissingMeta, NotRunnable> {
Clier {
registered_commands: NotRunnable,
args: Argv::from(&args().collect::<Vec<String>>()[1..]),
cli_meta: MissingMeta,
}
}
pub fn with_args(args: &[String]) -> Clier<MissingMeta, NotRunnable> {
Clier { registered_commands: NotRunnable, args: Argv::from(args), cli_meta: MissingMeta }
}
}
#[cfg_attr(docsrs, doc(cfg(feature = "macros")))]
#[cfg(feature = "macros")]
#[macro_export]
macro_rules! cmd {
($cmd_name:expr, $desc:expr, $function:expr) => {
$crate::builder::RCommand::new($cmd_name, $desc, $function)
};
}