refactor: extract argument parsing to separate module
This commit is contained in:
+23
-49
@@ -1,4 +1,5 @@
|
||||
mod app;
|
||||
mod args;
|
||||
mod audio;
|
||||
mod events;
|
||||
mod msg;
|
||||
@@ -24,26 +25,25 @@ use msg::Message;
|
||||
use terminal::TerminalGuard;
|
||||
use ui::render_app;
|
||||
|
||||
use args::{Cli, CliAction};
|
||||
|
||||
fn main() -> Result<(), io::Error> {
|
||||
let args: Vec<String> = std::env::args().collect();
|
||||
|
||||
if args.iter().any(|arg| arg == "-h" || arg == "--help") {
|
||||
println!("Usage: termato [options] [work_minutes] [break_minutes]");
|
||||
println!();
|
||||
println!("Options:");
|
||||
println!(" -n, --notify Enable desktop notifications");
|
||||
println!(" -h, --help Print this help message");
|
||||
println!(" -v, --version Print the version number");
|
||||
println!(" -z, --visualizer Display visualizer of playing audio");
|
||||
println!();
|
||||
println!("Defaults: work_minutes = 25, break_minutes = 5");
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
if args.iter().any(|arg| arg == "-v" || arg == "--version") {
|
||||
println!("termato version {}", env!("CARGO_PKG_VERSION"));
|
||||
return Ok(());
|
||||
}
|
||||
let config = match Cli::parse() {
|
||||
CliAction::PrintHelp => {
|
||||
Cli::print_help();
|
||||
return Ok(());
|
||||
}
|
||||
CliAction::PrintVersion => {
|
||||
Cli::print_version();
|
||||
return Ok(());
|
||||
}
|
||||
CliAction::Error(err) => {
|
||||
eprintln!("Error: {}", err);
|
||||
eprintln!("Run 'termato --help' for usage instructions.");
|
||||
std::process::exit(1);
|
||||
}
|
||||
CliAction::Run(cfg) => cfg,
|
||||
};
|
||||
|
||||
let _guard = TerminalGuard::new()?;
|
||||
|
||||
@@ -51,41 +51,15 @@ fn main() -> Result<(), io::Error> {
|
||||
let mut terminal = Terminal::new(backend)?;
|
||||
let font = Toilet::smblock().unwrap();
|
||||
|
||||
let enable_visualizer = args.iter().any(|arg| arg == "-z" || arg == "--visualizer");
|
||||
let enable_notifications = args.iter().any(|arg| arg == "-n" || arg == "--notify");
|
||||
|
||||
let visualizer = if enable_visualizer {
|
||||
let visualizer = if config.enable_visualizer {
|
||||
Some(AudioVisualizer::new(64))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
let is_flag = |arg: &str| {
|
||||
arg == "-n"
|
||||
|| arg == "--notify"
|
||||
|| arg == "-z"
|
||||
|| arg == "--visualizer"
|
||||
|| arg == "-h"
|
||||
|| arg == "--help"
|
||||
|| arg == "-v"
|
||||
|| arg == "--version"
|
||||
};
|
||||
|
||||
let positional_args: Vec<&String> = args.iter().skip(1).filter(|arg| !is_flag(arg)).collect();
|
||||
|
||||
let work_mins = positional_args
|
||||
.first()
|
||||
.and_then(|s| s.parse().ok())
|
||||
.unwrap_or(25);
|
||||
|
||||
let break_mins = positional_args
|
||||
.get(1)
|
||||
.and_then(|s| s.parse().ok())
|
||||
.unwrap_or(5);
|
||||
|
||||
let mut termato = Termato::new(work_mins, break_mins)
|
||||
.with_notifications(enable_notifications)
|
||||
.with_visualizer(enable_visualizer);
|
||||
let mut termato = Termato::new(config.work_mins, config.break_mins)
|
||||
.with_notifications(config.enable_notifications)
|
||||
.with_visualizer(config.enable_visualizer);
|
||||
|
||||
let (tx, rx) = mpsc::channel();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user