use std::ops::{Deref, DerefMut};
use std::str::FromStr;
#[macro_export]
macro_rules! require_envs {
(@func $fname:ident ?, $ename:literal, $ty:ty, $etext:literal) => {
$crate::require_envs! {@func pub $fname ?, $ename, $ty, $etext}
};
(@func $vis:vis $fname:ident ?, $ename:literal, $ty:ty, $etext:literal) => {
#[doc = $crate::__private::trimmed_help!($etext)]
$vis fn $fname() -> $crate::__private::Option<$ty> {
let x = $crate::__private::env::var($ename).ok();
x.and_then(|x| {
$crate::__private::Option::Some($crate::__private::FromStr::from_str(&x).expect($etext))
})
}
};
(@func $fname:ident ~, $ename:literal, $ty:ty, $etext:literal) => {
$crate::require_envs! {@func pub $fname ~, $ename, $ty, $etext}
};
(@func $vis:vis $fname:ident ~, $ename:literal, $ty:ty, $etext:literal) => {
#[doc = $crate::__private::trimmed_help!($etext)]
$vis fn $fname() -> $ty {
let x = $crate::__private::env::var($ename).ok();
let x = x.and_then(|x| {
$crate::__private::Option::Some($crate::__private::FromStr::from_str(&x).expect($etext))
});
x.unwrap_or_default()
}
};
(@func $fname:ident, $ename:literal, $ty:ty, $etext:literal) => {
$crate::require_envs! {@func pub $fname, $ename, $ty, $etext}
};
(@func $vis:vis $fname:ident, $ename:literal, $ty:ty, $etext:literal) => {
#[doc = $crate::__private::trimmed_help!($etext)]
$vis fn $fname() -> $ty {
$crate::__private::FromStr::from_str(&$crate::__private::env::var($ename).expect($etext)).expect($etext)
}
};
(@assert $vis:vis $fname:ident ?, $ename:literal, $ty:ty, $etext:literal) => {};
(@assert $vis:vis $fname:ident ~, $ename:literal, $ty:ty, $etext:literal) => {};
(@assert $vis:vis $fname:ident, $ename:literal, $ty:ty, $etext:literal) => {
let _ = $fname();
};
(@get_res $vis:vis $fname:ident $(?)? $(~)?, $ename:literal, $ty:ty, $etext:literal) => {
$crate::__private::env::var($ename)
};
(@etext $vis:vis $fname:ident $(?)? $(~)?, $ename:literal, $ty:ty, $etext:literal) => {
$etext
};
(($assert_name:ident, $any_set_name:ident, $help_name:ident); $($stream:tt)*) => {
pub fn $assert_name () {
$crate::__private::assert_var_body! {$crate $($stream)*}
}
pub fn $any_set_name() -> bool {
$crate::__private::any_set_body! {$crate $($stream)*}.iter().any(|x| x.is_ok())
}
pub fn $help_name() -> $crate::__private::String {
$crate::__private::help_body!{$crate $($stream)*}.iter().fold($crate::__private::String::new(), |a, x| {
a + x + "\n"
})
}
$crate::__private::getters! {$crate $($stream)*}
$crate::__private::errors! {$crate $($stream)*}
}
}
#[derive(Default, Copy, Clone, Hash, Debug)]
pub struct Flag {
pub val: bool,
}
impl FromStr for Flag {
type Err = ::core::convert::Infallible;
fn from_str(_: &str) -> Result<Self, Self::Err> {
Ok(Self { val: true })
}
}
impl Deref for Flag {
type Target = bool;
fn deref(&self) -> &Self::Target {
&self.val
}
}
impl DerefMut for Flag {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.val
}
}
#[doc(hidden)]
pub mod __private {
pub use ::menv_proc_macro::{any_set_body, assert_var_body, errors, getters, help_body, trimmed_help};
pub use ::std::env;
pub use ::std::option::Option;
pub use ::std::str::FromStr;
pub use ::std::string::String;
}