diff --git a/src/main.rs b/src/main.rs index 896fe08..0c087d5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,6 +23,15 @@ use tui::{event::EventChannel, handler::EventHandler, listener::EventListener, u #[derive(StructOpt)] struct Opt { + #[structopt(flatten)] + lib_opt: LibOpt, + + #[structopt(flatten)] + db_opt: DbOpt, +} + +#[derive(StructOpt)] +struct LibOpt { #[structopt(long = "ssh", help = "Beets SSH URI")] beets_ssh_uri: Option, @@ -31,7 +40,10 @@ struct Opt { #[structopt(long = "no-library", help = "Do not connect to the library")] no_library: bool, +} +#[derive(StructOpt)] +struct DbOpt { #[structopt( long = "database", help = "Database file path", @@ -60,19 +72,19 @@ fn with(builder: MusicHoardBuilder) { Tui::run(terminal, ui, handler, listener).expect("failed to run tui"); } -fn with_database(opt: Opt, builder: MusicHoardBuilder) { - if opt.no_database { +fn with_database(db_opt: DbOpt, builder: MusicHoardBuilder) { + if db_opt.no_database { with(builder.set_database(NullDatabase)); } else { // Create an empty database file if it does not exist. match OpenOptions::new() .write(true) .create_new(true) - .open(&opt.database_file_path) + .open(&db_opt.database_file_path) { Ok(f) => { drop(f); - JsonDatabase::new(JsonDatabaseFileBackend::new(&opt.database_file_path)) + JsonDatabase::new(JsonDatabaseFileBackend::new(&db_opt.database_file_path)) .save::(&vec![]) .expect("failed to create empty database"); } @@ -82,17 +94,17 @@ fn with_database(opt: Opt, builder: MusicHoardBuilder) { - if opt.no_library { - with_database(opt, builder.set_library(NullLibrary)); - } else if let Some(uri) = opt.beets_ssh_uri { +fn with_library(lib_opt: LibOpt, db_opt: DbOpt, builder: MusicHoardBuilder) { + if lib_opt.no_library { + with_database(db_opt, builder.set_library(NullLibrary)); + } else if let Some(uri) = lib_opt.beets_ssh_uri { let uri = uri.into_string().expect("invalid SSH URI"); - let beets_config_file_path = opt + let beets_config_file_path = lib_opt .beets_config_file_path .map(|s| s.into_string()) .transpose() @@ -100,17 +112,18 @@ fn with_library(opt: Opt, builder: MusicHoardBuilder) { let lib_exec = BeetsLibrarySshExecutor::new(uri) .expect("failed to initialise beets") .config(beets_config_file_path); - with_database(opt, builder.set_library(BeetsLibrary::new(lib_exec))); + with_database(db_opt, builder.set_library(BeetsLibrary::new(lib_exec))); } else { - let lib_exec = BeetsLibraryProcessExecutor::default().config(opt.beets_config_file_path); - with_database(opt, builder.set_library(BeetsLibrary::new(lib_exec))); + let lib_exec = + BeetsLibraryProcessExecutor::default().config(lib_opt.beets_config_file_path); + with_database(db_opt, builder.set_library(BeetsLibrary::new(lib_exec))); } } fn main() { let opt = Opt::from_args(); let builder = MusicHoardBuilder::default(); - with_library(opt, builder); + with_library(opt.lib_opt, opt.db_opt, builder); } #[cfg(test)]