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