parent
878c58b49e
commit
e96f9ab8c7
@ -0,0 +1,30 @@
|
||||
//! Arg parsing
|
||||
use super::*;
|
||||
|
||||
pub fn program_name() -> &'static str
|
||||
{
|
||||
lazy_static::lazy_static!{
|
||||
static ref NAME: &'static str = Box::leak(std::env::args().next().unwrap().into_boxed_str());
|
||||
}
|
||||
|
||||
&NAME[..]
|
||||
}
|
||||
|
||||
#[inline] pub fn parse() -> ReportedResult<config::Config>
|
||||
{
|
||||
parse_as_args(std::env::args().skip(1))
|
||||
}
|
||||
|
||||
pub fn parse_as_args<T,I>(args: I) -> ReportedResult<config::Config>
|
||||
where I: IntoIterator<Item=T>,
|
||||
T: AsRef<str>
|
||||
{
|
||||
let mut args = args.into_iter();
|
||||
|
||||
while let Some(arg) = args.next() {
|
||||
let arg = arg.as_ref();
|
||||
|
||||
}
|
||||
|
||||
todo!()
|
||||
}
|
@ -0,0 +1,104 @@
|
||||
//! Config and params
|
||||
use std::{
|
||||
path::{
|
||||
PathBuf,
|
||||
},
|
||||
error,
|
||||
};
|
||||
|
||||
/// The error handling mode for this run.
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Hash, Ord, PartialOrd)]
|
||||
pub enum ErrorMode
|
||||
{
|
||||
Ignore,
|
||||
Report,
|
||||
Cancel,
|
||||
Terminate,
|
||||
}
|
||||
|
||||
pub trait ErrModeExt<T,E>
|
||||
{
|
||||
fn handle_with(self, err: &ErrorMode) -> Result<Option<T>,E>;
|
||||
}
|
||||
impl<T,E> ErrModeExt<T,E> for Result<T,E>
|
||||
where E: error::Error
|
||||
{
|
||||
#[inline] fn handle_with(self, err: &ErrorMode) -> Result<Option<T>,E>
|
||||
{
|
||||
err.handle(self)
|
||||
}
|
||||
}
|
||||
|
||||
impl ErrorMode
|
||||
{
|
||||
pub fn handle<T,E>(&self, err: Result<T,E>) -> Result<Option<T>, E>
|
||||
where E: error::Error,
|
||||
{
|
||||
match err {
|
||||
Ok(v) => Ok(Some(v)),
|
||||
Err(err) => {
|
||||
match self {
|
||||
Self::Ignore => Ok(None),
|
||||
Self::Report => {
|
||||
eprintln!("Error: {}", err);
|
||||
Ok(None)
|
||||
},
|
||||
Self::Cancel => {
|
||||
Err(err)
|
||||
},
|
||||
Self::Terminate => {
|
||||
eprintln!("Fatal error: {}", err);
|
||||
std::process::exit(-1)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for ErrorMode
|
||||
{
|
||||
#[inline]
|
||||
fn default() -> Self
|
||||
{
|
||||
Self::Report
|
||||
}
|
||||
}
|
||||
|
||||
/// The common options flags for all modes
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Hash, Ord, PartialOrd)]
|
||||
pub struct Flags
|
||||
{
|
||||
pub verbose: bool,
|
||||
pub error_mode: ErrorMode,
|
||||
}
|
||||
|
||||
impl Default for Flags
|
||||
{
|
||||
#[inline]
|
||||
fn default() -> Self
|
||||
{
|
||||
Self {
|
||||
verbose: false,
|
||||
error_mode: ErrorMode::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Each option mode
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub enum Mode
|
||||
{
|
||||
Normal {
|
||||
paths: Vec<PathBuf>,
|
||||
},
|
||||
Help,
|
||||
}
|
||||
|
||||
/// All config for this run
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub struct Config
|
||||
{
|
||||
pub data: Mode,
|
||||
pub flags: Flags,
|
||||
}
|
Loading…
Reference in new issue