diff options
Diffstat (limited to 'ozone-cli/src')
| -rw-r--r-- | ozone-cli/src/cli.rs | 46 | ||||
| -rw-r--r-- | ozone-cli/src/main.rs | 47 |
2 files changed, 85 insertions, 8 deletions
diff --git a/ozone-cli/src/cli.rs b/ozone-cli/src/cli.rs new file mode 100644 index 0000000..d288e3c --- /dev/null +++ b/ozone-cli/src/cli.rs @@ -0,0 +1,46 @@ +use std::path::PathBuf;
+use clap::{Args, Parser, Subcommand};
+
+#[derive(Subcommand, Debug)]
+pub enum ProfileCommand {
+ Select,
+ Create,
+ List
+}
+
+#[derive(Args, Debug)]
+pub struct ProfileArgs {
+ #[command(subcommand)]
+ subcmd: Option<ProfileCommand>
+}
+
+impl ProfileArgs {
+ pub fn take_command(&mut self) -> ProfileCommand {
+ self.subcmd.take().unwrap_or(ProfileCommand::List)
+ }
+}
+
+#[derive(Subcommand, Debug)]
+pub enum RootCommand {
+ Profile(ProfileArgs),
+ Instance,
+
+}
+
+#[derive(Parser, Debug)]
+#[clap(version)]
+pub struct Cli {
+ /// Run the launcher in offline mode. The launcher will not attempt to make any requests using
+ /// the network. The launcher _will_ verify the integrity of files required to launch the game,
+ /// and refuse to launch the game with an error if it must download a file.
+ #[arg(long, global = true)]
+ pub offline: bool,
+
+ /// Directory which the launcher will perform its work in. Defaults to an application-specific
+ /// directory based on your OS.
+ #[arg(long, global = true, value_hint = clap::ValueHint::DirPath)]
+ pub home: Option<PathBuf>,
+
+ #[command(subcommand)]
+ pub subcmd: RootCommand
+}
diff --git a/ozone-cli/src/main.rs b/ozone-cli/src/main.rs index a17979e..b449209 100644 --- a/ozone-cli/src/main.rs +++ b/ozone-cli/src/main.rs @@ -1,16 +1,49 @@ +mod cli; + use std::error::Error; +use std::path::PathBuf; +use std::process::{ExitCode, ExitStatus}; use log::{error, info}; +use clap::{Args, Parser, Subcommand}; use ozone::launcher::{Launcher, Settings}; +use crate::cli::{Cli, ProfileCommand, RootCommand}; + +async fn main_inner(cli: Cli) -> Result<ExitCode, Box<dyn Error>> { + let Some(home) = cli.home.or_else(|| Launcher::sensible_home()) else { + error!("Could not choose a launcher home directory. Please choose one with `--home'."); + Ok(ExitCode::FAILURE) // we print our own error message + }; + + info!("Sensible home could be {home:?}"); + let settings = Settings::load(home.join("ozone.json")).await?; + settings.save().await?; + + match cli.subcmd { + RootCommand::Profile(mut p) => match p.take_command() { + ProfileCommand::List => { + + } + } + } + + Ok(ExitCode::SUCCESS) +} + #[tokio::main] -async fn main() -> Result<(), Box<dyn Error>> { +async fn main() -> ExitCode { simple_logger::SimpleLogger::new().env().init().unwrap(); - info!("Sensible home could be {:?}", Launcher::sensible_home()); - let settings = Settings::load("./work/ozone.json").await?; - settings.save().await?; + let arg = dbg!(Cli::parse()); - let launcher = Launcher::new("./work", true).await?; + main_inner(arg).await.unwrap_or_else(|e| { + error!("Launcher initialization error:"); + error!("{e}"); + + ExitCode::FAILURE + }) + + /*let launcher = Launcher::new("./work", true).await?; let profile = settings.get_profile("default").unwrap(); @@ -22,7 +55,5 @@ async fn main() -> Result<(), Box<dyn Error>> { dbg!(&launch); info!("ok"); - ozone::launcher::run_the_game(&launch)?; - - Ok(()) + ozone::launcher::run_the_game(&launch)?;*/ } |
