1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
mod build;
mod case;
mod error;
mod help;
pub mod meta;
mod parse;
pub mod scope;
mod spell;
mod stack;
pub use crate::{
build::Builder,
case::Case,
error::Error,
meta::Options,
parse::{Parse, Parser},
scope::Scope,
};
/*
TODO:
- Could I use the same 'Parse' trait to generate an API?
- Generate usage string automatically.
- Usage: {verb (for root use the root name)} [position options (if any)] [named options (if any)] {sub-command (if any)}
- Support for styled formatting out of the box; use a feature?
- Parse with graceful handling of 'Error::Help' and 'Error::Version'.
- Support for indexed arguments.
- Ensure that variables don't obscure the context variable.
- Support for streamed arguments via stdin, file system, http.
- Ability to overwrite the type name.
- Support for a value with --help
- Allows to provide a help context when help becomes very large (ex: --help branch)
- Autocomplete?
- Simplify the 'Into<Cow<'static, str>>' all over the place, if possible.
- There are probably some places where the `Cow` isn't useful.
- Add support for combined flags using the short names when possible.
- Short names must be of length 1.
- ex: ls -l -a -r -t => ls -lart
- Can I unify 'Builder' and 'Parser'?
- Allow to rename '--help' and '--version'?
- Support for json values.
- Find a way to get rid of the '.ok()'. It is very confusing.
- What if an option has an child that is an option/verb/Group?
- Different kinds of 'help' such as 'usage', 'summary', 'detail'; that will be displayed in different contexts.
- The motivation comes from differentiating the 'summary' help and the 'detail' help.
- Summaries will be shown from the parent node.
- Details will be shown only for the specific node.
- Maybe show the help only at the current node level and require a parameter to show from the parent.
- Display the valid values for enums.
- Format default enum values with proper casing when using '.default()'.
*/
const HELP: usize = usize::MAX;
const VERSION: usize = usize::MAX - 1;
const BREAK: usize = usize::MAX - 2;
const SHIFT: u32 = 5;
const MASK: usize = (1 << SHIFT) - 1;
const MAXIMUM: u32 = usize::BITS - 14;