mod constants; mod errors; mod config; mod minecraft; mod platform; mod util; use clap::Parser; use config::Config; use dotenvy::dotenv; use errors::McError; use log::{debug, info}; use crate::minecraft::{ downloads::download_all, extraction::extract_natives, launcher::launch, manifests, }; #[derive(Parser, Debug)] #[command(author, about, disable_version_flag = true)] struct Cli { #[arg(long)] version: Option, #[arg(long)] username: Option, #[arg(long, num_args(0..), allow_hyphen_values = true)] jvm_args: Vec, } #[tokio::main] async fn main() -> Result<(), McError> { dotenv().ok(); env_logger::init(); let cli = Cli::parse(); let mut config = Config::load()?; if let Some(v) = cli.version { config.version = v; } if let Some(u) = cli.username { config.username = u; } if !cli.jvm_args.is_empty() { config.jvm_args = cli.jvm_args; } info!("Final config after CLI overrides: {:?}", config); platform::paths::ensure_dirs(&config)?; info!("Using Minecraft version {}", config.version); let version = manifests::load_version(&config).await?; info!("Loaded version manifest for: {}", version.id); debug!("Main class: {}", version.main_class); download_all(&config, &version).await?; extract_natives(&config, &version)?; launch(&config, &version)?; Ok(()) }