use crate::{
ConfBuilder, ConfContext, ConfValueSource, Error, InnerError, ParsedEnv, Parser, ParserConfig,
ProgramOption, introspection, lazybuf::LazyBuf,
};
use std::ffi::OsString;
#[doc = include_str!("../REFERENCE_derive_conf.md")]
pub trait Conf: Sized {
#[inline]
fn parse() -> Self {
Self::conf_builder().parse()
}
#[inline]
fn try_parse() -> Result<Self, Error> {
Self::conf_builder().try_parse()
}
#[inline]
fn parse_from<T, K, V>(
args_os: impl IntoIterator<Item: Into<OsString>>,
env_vars_os: impl IntoIterator<Item = (K, V)>,
) -> Self
where
K: Into<OsString>,
V: Into<OsString>,
{
Self::conf_builder().args(args_os).env(env_vars_os).parse()
}
fn try_parse_from<T, K, V>(
args_os: impl IntoIterator<Item = T>,
env_vars_os: impl IntoIterator<Item = (K, V)>,
) -> Result<Self, Error>
where
T: Into<OsString> + Clone,
K: Into<OsString> + Clone,
V: Into<OsString> + Clone,
{
Self::conf_builder()
.args(args_os)
.env(env_vars_os)
.try_parse()
}
fn conf_builder() -> ConfBuilder<Self> {
Default::default()
}
fn program_options() -> impl Iterator<Item: introspection::ProgramOptionMeta> {
Self::PROGRAM_OPTIONS.iter()
}
#[doc(hidden)]
fn parser_debug_asserts() {
let parsed_env = ParsedEnv::default();
let program_options = Self::PROGRAM_OPTIONS.iter().collect::<Vec<_>>();
let parser =
Self::get_parser(&parsed_env, program_options).expect("Failed to create parser");
let _ = parser.render_clap_help();
parser.into_command().debug_assert();
}
#[doc(hidden)]
fn debug_asserts();
#[doc(hidden)]
fn get_parser(
parsed_env: &ParsedEnv,
program_options: Vec<ProgramOption>,
) -> Result<Parser, Error> {
let parser_config = Self::get_parser_config()?;
let subcommands = Self::get_subcommands(parsed_env)?;
Parser::new(parser_config, program_options, subcommands, parsed_env)
}
#[doc(hidden)]
fn get_parser_config() -> Result<ParserConfig, Error>;
#[doc(hidden)]
const PROGRAM_OPTIONS: LazyBuf<ProgramOption>;
#[doc(hidden)]
fn get_subcommands(parsed_env: &ParsedEnv) -> Result<Vec<Parser>, Error>;
#[doc(hidden)]
fn from_conf_context(conf_context: ConfContext<'_>) -> Result<Self, Vec<InnerError>>;
#[doc(hidden)]
fn any_program_options_appeared<'a>(
conf_context: &ConfContext<'a>,
) -> Result<Option<(&'a str, ConfValueSource<&'a str>)>, InnerError> {
for (relative_id, opt) in conf_context.get_relevant_program_options() {
if let Some(value_source) = conf_context.option_appears(relative_id)? {
return Ok(Some((&opt.id, value_source)));
}
}
Ok(None)
}
#[doc(hidden)]
fn get_name() -> &'static str;
}
#[doc = include_str!("../REFERENCE_derive_subcommands.md")]
pub trait Subcommands: Sized {
#[doc(hidden)]
fn get_parsers(env: &ParsedEnv) -> Result<Vec<Parser>, Error>;
#[doc(hidden)]
fn get_subcommand_names() -> &'static [&'static str];
#[doc(hidden)]
fn from_conf_context(
command_name: String,
conf_context: ConfContext<'_>,
) -> Result<Self, Vec<InnerError>>;
#[doc(hidden)]
fn debug_asserts();
}