diff --git a/src/main.rs b/src/main.rs index 015659c2..874248f1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,6 +9,7 @@ mod netplay; mod savestates; mod ui; use clap::Parser; +use std::io::Error; use ui::gui; /// N64 emulator @@ -74,112 +75,89 @@ struct Args { } #[tokio::main] -async fn main() { +async fn main() -> std::io::Result<()> { let dirs = ui::get_dirs(); - let mut result = std::fs::create_dir_all(dirs.config_dir); - if result.is_err() { - panic!("could not create config dir: {}", result.err().unwrap()) - } - result = std::fs::create_dir_all(dirs.data_dir.join("saves")); - if result.is_err() { - panic!("could not create save dir: {}", result.err().unwrap()) - } - result = std::fs::create_dir_all(dirs.data_dir.join("states")); - if result.is_err() { - panic!("could not create state dir: {}", result.err().unwrap()) - } - + std::fs::create_dir_all(dirs.config_dir)?; + std::fs::create_dir_all(dirs.data_dir.join("saves"))?; + std::fs::create_dir_all(dirs.data_dir.join("states"))?; let args = Args::parse(); - let args_as_strings: Vec = std::env::args().collect(); - let args_count = args_as_strings.len(); - if args_count > 1 && args.game.is_none() { + if let Some(game) = args.game { + let file_path = std::path::Path::new(&game); + let Some(rom_contents) = device::get_rom_contents(file_path) else { + return Err(Error::other(format!( + "Could not read ROM file: {}", + file_path.display() + ))); + }; + let handle = std::thread::Builder::new() + .name("n64".to_string()) + .stack_size(env!("N64_STACK_SIZE").parse().unwrap()) + .spawn(move || { + let mut device = device::Device::new(); + let overclock = device.ui.config.emulation.overclock; + let disable_expansion_pak = device.ui.config.emulation.disable_expansion_pak; + + let game_cheats = { + let game_crc = ui::storage::get_game_crc(&rom_contents); + let cheats = ui::config::Cheats::new(); + cheats.cheats.get(&game_crc).cloned().unwrap_or_default() + }; + device::run_game( + &mut device, + rom_contents, + ui::gui::GameSettings { + fullscreen: args.fullscreen, + overclock, + disable_expansion_pak, + cheats: game_cheats, + }, + ); + })?; + + handle.join().unwrap(); + } else if std::env::args().count() > 1 { let mut ui = ui::Ui::new(); if args.clear_input_bindings { ui::input::clear_bindings(&mut ui); - return; + return Ok(()); } - if args.port.is_some() { - let port = args.port.unwrap(); - if !(1..=4).contains(&port) { - println!("Port must be betwen 1 and 4"); - return; - } + if let Some(port) = args.port + && !(1..=4).contains(&port) + { + return Err(Error::other("Port must be between 1 and 4")); } if args.list_controllers { let controllers = ui::input::get_controller_names(&ui); for (i, controller) in controllers.iter().enumerate() { println!("Controller {i}: {controller}"); } - return; + return Ok(()); } - if args.configure_input_profile.is_some() { + if let Some(profile) = args.configure_input_profile { ui::input::configure_input_profile( &mut ui, - args.configure_input_profile.unwrap(), + profile, args.use_dinput, args.deadzone.unwrap_or(ui::input::DEADZONE_DEFAULT), ); - return; + return Ok(()); } - if args.assign_controller.is_some() { - if args.port.is_none() { - println!("Must specify port number"); - return; - } - ui::input::assign_controller( - &mut ui, - args.assign_controller.unwrap(), - args.port.unwrap(), - ); + if let Some(assign_controller) = args.assign_controller { + let Some(port) = args.port else { + return Err(Error::other("Must specify port number")); + }; + ui::input::assign_controller(&mut ui, assign_controller, port); } - if args.bind_input_profile.is_some() { - if args.port.is_none() { - println!("Must specify port number"); - return; - } - ui::input::bind_input_profile( - &mut ui, - args.bind_input_profile.unwrap(), - args.port.unwrap(), - ); - } - } else if args.game.is_some() { - let file_path = std::path::Path::new(args.game.as_ref().unwrap()); - if let Some(rom_contents) = device::get_rom_contents(file_path) { - let handle = std::thread::Builder::new() - .name("n64".to_string()) - .stack_size(env!("N64_STACK_SIZE").parse().unwrap()) - .spawn(move || { - let mut device = device::Device::new(); - let overclock = device.ui.config.emulation.overclock; - let disable_expansion_pak = device.ui.config.emulation.disable_expansion_pak; - - let game_cheats = { - let game_crc = ui::storage::get_game_crc(&rom_contents); - let cheats = ui::config::Cheats::new(); - cheats.cheats.get(&game_crc).cloned().unwrap_or_default() - }; - device::run_game( - &mut device, - rom_contents, - ui::gui::GameSettings { - fullscreen: args.fullscreen, - overclock, - disable_expansion_pak, - cheats: game_cheats, - }, - ); - }) - .unwrap(); - - handle.join().unwrap(); - } else { - println!("Could not read rom file"); - return; + if let Some(profile) = args.bind_input_profile { + let Some(port) = args.port else { + return Err(Error::other("Must specify port number")); + }; + ui::input::bind_input_profile(&mut ui, profile, port); } } else { gui::app_window(); } + Ok(()) }