mod switches; pub use switches::{Switches, SwitchesError as Error}; #[macro_export] macro_rules! generate { ( $structname:ident { $($field:ident: $type:tt ($($opt:expr),+)),* $(,)? } ) => { macro_rules! build { ($f:ident, PathBuf) => {$f.as_path()}; ($f:ident, Option) => {$f.as_opt_path()}; ($f:ident, String) => {$f.as_string()}; ($f:ident, Option) => {$f.as_opt_string()}; ($f:ident, bool) => {$f.as_flag()}; ($f:ident, u16) => {$f.as_u16()}; } pub struct $structname { $(pub $field: $type),* } impl $structname { pub fn parse() -> Result { let mut switches = switches::Switches::from_env(); $( let mut $field = switches$(.or($opt))+; let $field = build!($field, $type)?; )* Ok(Self { $($field,)* }) } pub fn parse_and_raise() -> Self { match Self::parse() { Ok(parsed) => parsed, Err(err) => { eprintln!("[ERROR] {}", err); std::process::exit(1); } } } } }; }