use crate::Tags;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum HelpRequest {
Succinct,
Full,
}
#[derive(Debug, Clone, Copy)]
pub struct Description<'a> {
pub succinct: &'a str,
pub full: &'a str,
}
impl<'a> Description<'a> {
#[inline]
#[must_use]
pub const fn new(description: &'a str) -> Self {
Self {
succinct: description,
full: description,
}
}
#[inline]
#[must_use]
pub const fn get(&self, style: HelpRequest) -> &'a str {
match style {
HelpRequest::Succinct => self.succinct,
HelpRequest::Full => self.full,
}
}
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy)]
pub struct ValueParameter<'a> {
pub placeholder: &'a str,
pub values: Option<&'a [&'a str]>,
}
pub trait Usage {
const NAME: &'static str;
const DESCRIPTION: Description<'static>;
const ITEMS: UsageItems<'static>;
}
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum UsageItems<'a> {
Parameters { parameters: &'a [Parameter<'a>] },
Subcommands {
requirement: Requirement,
commands: &'a [Subcommand<'a>],
},
Exclusive {
requirement: Requirement,
groups: &'a [&'a [ParameterFlag<'a>]],
all_flags: &'a [ParameterFlag<'a>],
},
}
#[derive(Debug, Clone)]
pub enum Parameter<'a> {
Flag(ParameterFlag<'a>),
Positional(ParameterPositional<'a>),
Group(ParameterSubgroup<'a>),
}
impl<'a> Parameter<'a> {
pub const fn as_option(&self) -> Option<&ParameterFlag<'a>> {
match self {
Parameter::Flag(opt) => Some(opt),
_ => None,
}
}
pub const fn as_positional(&self) -> Option<&ParameterPositional<'a>> {
match self {
Parameter::Positional(pos) => Some(pos),
_ => None,
}
}
pub const fn as_subgroup(&self) -> Option<&ParameterSubgroup<'a>> {
match self {
Parameter::Group(group) => Some(group),
_ => None,
}
}
}
#[derive(Debug, Clone)]
pub struct ParameterFlag<'a> {
pub description: Description<'a>,
pub requirement: Requirement,
pub repetition: Repetition,
pub argument: Option<ValueParameter<'a>>,
pub tags: Tags<'a>,
}
#[derive(Debug, Clone)]
pub struct ParameterPositional<'a> {
pub description: Description<'a>,
pub requirement: Requirement,
pub repetition: Repetition,
pub argument: ValueParameter<'a>,
}
#[derive(Debug, Clone)]
pub struct ParameterSubgroup<'a> {
pub description: Description<'a>,
pub id: &'a str,
pub title: &'a str,
pub placeholder: &'a str,
pub contents: UsageItems<'a>,
}
#[derive(Debug, Clone)]
pub struct Subcommand<'a> {
pub command: &'a str,
pub description: Description<'a>,
pub usage: UsageItems<'a>,
}
pub trait ParameterUsage {
const VALUE: ParameterValueKind;
const REQUIREMENT: Requirement;
const REPETITION: Repetition;
}
#[derive(Debug, Clone, Copy)]
pub enum ParameterValueKind {
Flag,
Value,
OneOf(&'static [&'static str]),
}
impl ParameterValueKind {
pub const fn as_value_parameter<'a>(&'a self, placeholder: &'a str) -> ValueParameter<'a> {
ValueParameter {
placeholder,
values: match *self {
Self::OneOf(values) => Some(values),
_ => None,
},
}
}
pub const fn as_maybe_value_parameter<'a>(
&'a self,
placeholder: &'a str,
) -> Option<ValueParameter<'a>> {
match *self {
ParameterValueKind::Flag => None,
ParameterValueKind::Value => Some(ValueParameter {
placeholder,
values: None,
}),
ParameterValueKind::OneOf(values) => Some(ValueParameter {
placeholder,
values: Some(values),
}),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Requirement {
Optional,
Mandatory,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Repetition {
Single,
Multiple,
}