#![allow(unused)]
use clap::Parser;
use crate::{
app::App,
args::{Cli, Command},
cache::Cache,
error::Error,
format::Formatter,
parser::{packwiz::PackwizParser, text::TextParser},
request::{Mod, curseforge::get_curseforge_mods, modrinth::get_modrinth_mods},
};
mod app;
mod args;
mod cache;
mod consts;
mod env;
mod error;
mod format;
mod parser;
mod request;
mod util;
fn setup_logging(verbosity: args::Verbosity) {
let level = verbosity.to_level_filter();
simple_logger::SimpleLogger::new()
.with_level(log::LevelFilter::Warn.min(level))
.with_module_level(env!("CARGO_CRATE_NAME"), level)
.without_timestamps()
.env()
.init()
.unwrap();
colored::control::set_override(true);
#[cfg(windows)]
colored::control::set_virtual_terminal(true).unwrap();
}
const CACHE_PATH: &str = ".packwiz-modlist.cache.json";
fn run(cli: Cli) -> Result<(), Error> {
match std::env::current_dir() {
Ok(cwd) => log::debug!("working directory: \"{}\"", cwd.display()),
Err(err) => log::debug!("could not determine working directory: {err}"),
}
let pack_root = crate::env::pack_root();
log::debug!("pack root: \"{}\"", pack_root.display());
let cache = Cache::load(CACHE_PATH)?;
let pw_parser = PackwizParser::load_from(pack_root)?;
let app = App::new(cache, pw_parser);
if let Err(err) = app.run(cli) {
log::error!("{err}");
}
if let Err(err) = app.close() {
log::error!("{err}");
}
Ok(())
}
fn main() {
let cli = args::Cli::parse();
let verbosity = args::Verbosity::resolve(cli.verbose, cli.quiet);
setup_logging(verbosity);
crate::env::load_dotenv();
let result = match cli.command {
Some(Command::Config { path }) => args::config(path),
Some(Command::About) => args::about(),
None => run(cli).map_err(|err| err.to_string()),
};
if let Err(err) = result {
log::error!("{err}");
}
}