Files
ncspot/src/main.rs
Thomas Frans abffb3c2a9 refactor: move cli argument parsing to main
Command line arguments are part of the OS process and should be under
main.
2023-06-02 23:20:24 +02:00

79 lines
2.1 KiB
Rust

#[macro_use]
extern crate cursive;
#[macro_use]
extern crate lazy_static;
#[macro_use]
extern crate serde;
use std::backtrace;
use std::fs::File;
use std::io::Write;
use std::path::PathBuf;
use application::Application;
use ncspot::program_arguments;
mod application;
mod authentication;
mod command;
mod commands;
mod config;
mod events;
mod ext_traits;
mod library;
mod model;
mod queue;
mod serialization;
mod sharing;
mod spotify;
mod spotify_api;
mod spotify_url;
mod spotify_worker;
mod theme;
mod traits;
mod ui;
mod utils;
#[cfg(unix)]
mod ipc;
#[cfg(feature = "mpris")]
mod mpris;
/// Register a custom panic handler to write the backtrace to a file since stdout is in use by the
/// Cursive TUI library during most of the application.
fn register_backtrace_panic_handler() {
// During most of the program, Cursive is responsible for drawing to the
// tty. Since stdout probably doesn't work as expected during a panic, the
// backtrace is written to a file at $USER_CACHE_DIR/ncspot/backtrace.log.
std::panic::set_hook(Box::new(|panic_info| {
// A panic hook will prevent the default panic handler from being
// called. An unwrap in this part would cause a hard crash of ncspot.
// Don't unwrap/expect/panic in here!
if let Ok(backtrace_log) = config::try_proj_dirs() {
let mut path = backtrace_log.cache_dir;
path.push("backtrace.log");
if let Ok(mut file) = File::create(path) {
writeln!(file, "{}", backtrace::Backtrace::force_capture()).unwrap_or_default();
writeln!(file, "{panic_info}").unwrap_or_default();
}
}
}));
}
// Functionality related to the operating system process itself is implemented here.
// Functionality related to ncspot goes into `Application`.
fn main() -> Result<(), String> {
register_backtrace_panic_handler();
let matches = program_arguments().get_matches();
let mut application = Application::new(
matches.get_one::<PathBuf>("debug").cloned(),
matches.get_one::<PathBuf>("basepath").cloned(),
matches.get_one::<PathBuf>("config").cloned(),
)?;
application.run()
}