use argsplitter::{main_support, ArgError, ArgSplitter};
use std::{error::Error, path::PathBuf, process::ExitCode};
const USAGE: &str = r###"
Usage: send_mail [OPTIONS..] RECIPIENT..
Options:
-v --verbose Describe what's going on
-a --attach FILE Attach this file
-s --subject TEXT Subject: line
-h --help Print this help
"###;
fn main() -> ExitCode {
main_support::report_errors(USAGE, work())
}
fn work() -> Result<(), Box<dyn Error>> {
let mut verbose = false;
let mut subject: Option<String> = None;
let mut attachments: Vec<PathBuf> = vec![];
let mut argsplitter = ArgSplitter::from_env();
while let Some(flag) = argsplitter.flag()? {
match flag {
"-h" | "--help" => {
println!("{}", USAGE.trim());
return Err(ArgError::exit_successfully().into());
}
"-v" | "--verbose" => verbose = true,
"-s" | "--subject" => subject = Some(argsplitter.param()?),
"-a" | "--attach" => attachments.push(argsplitter.param_os()?.into()),
flag => return Err(ArgError::unknown_flag(flag))?,
}
}
let recipients: Result<Vec<_>, _> = argsplitter.stashed_args(1, "RECIPIENTS").collect();
let recipients = recipients?;
println!("verbose={verbose}");
println!("subject={subject:?}");
println!("recipients={recipients:?}");
println!("attachments={attachments:?}");
Ok(())
}