#![allow(clippy::too_many_arguments)]
mod cli;
mod cloud;
mod gui;
mod lang;
mod path;
mod prelude;
mod resource;
mod scan;
mod serialization;
#[cfg(test)]
mod testing;
use crate::{
gui::Flags,
lang::TRANSLATOR,
prelude::{app_dir, CONFIG_DIR, VERSION},
};
fn prepare_logging() -> Result<flexi_logger::LoggerHandle, flexi_logger::FlexiLoggerError> {
flexi_logger::Logger::try_with_env_or_str("ludusavi=warn")
.unwrap()
.log_to_file(flexi_logger::FileSpec::default().directory(app_dir()))
.write_mode(flexi_logger::WriteMode::Async)
.rotate(
flexi_logger::Criterion::Size(1024 * 1024 * 10),
flexi_logger::Naming::Timestamps,
flexi_logger::Cleanup::KeepLogFiles(4),
)
.use_utc()
.format_for_files(|w, now, record| {
write!(
w,
"[{}] {} [{}] {}",
now.format("%Y-%m-%dT%H:%M:%S%.3fZ"),
record.level(),
record.module_path().unwrap_or("<unnamed>"),
&record.args(),
)
})
.start()
}
fn main() {
let args = cli::parse();
if let Some(config_dir) = args.config.as_deref() {
*CONFIG_DIR.lock().unwrap() = Some(config_dir.to_path_buf());
}
match args.sub {
None => {
#[cfg(target_os = "windows")]
{
if std::env::var(crate::prelude::ENV_DEBUG).is_err() {
let code = unsafe { winapi::um::wincon::FreeConsole() };
if code == 0 {
eprintln!("Unable to detach the console");
std::process::exit(1);
}
}
}
#[allow(unused)]
let logger = prepare_logging();
log::debug!("Version: {}", *VERSION);
let flags = Flags {
update_manifest: !args.no_manifest_update,
};
gui::run(flags);
}
Some(sub) => {
#[allow(unused)]
let logger = prepare_logging();
log::debug!("Version: {}", *VERSION);
if let Err(e) = cli::run(sub, args.no_manifest_update, args.try_manifest_update) {
eprintln!("{}", TRANSLATOR.handle_error(&e));
std::process::exit(1);
}
}
};
}