diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/errors.rs | 13 | ||||
-rw-r--r-- | src/main.rs | 126 |
2 files changed, 138 insertions, 1 deletions
diff --git a/src/errors.rs b/src/errors.rs new file mode 100644 index 0000000..f5a68e9 --- /dev/null +++ b/src/errors.rs @@ -0,0 +1,13 @@ +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum CliError { + #[error("Solarlib error: {0}")] + Solarlib(#[from] solarlib::errors::Error), + + #[error("CliError: {0}")] + Cli(String), + + #[error("Reqwest: {0}")] + Reqwest(#[from] reqwest::Error), +} diff --git a/src/main.rs b/src/main.rs index e7a11a9..d55df8e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,127 @@ +use clap::Parser; +mod errors; +use errors::CliError; +use tabular::{row, Table}; +use reqwest::{blocking::Client, StatusCode}; +use solarlib::planet::Planet; + +/// Manage solard and homeworld instances +#[derive(Parser)] +#[clap(author, version, about)] +struct Args { + /// The solard server to connect to + server: String, + /// The action to be taken + #[clap(subcommand)] + action: Action +} + +#[derive(clap::Subcommand)] +enum Action { + /// List planets on the server + List, + /// Shuts down a virtual machine + Stop { + /// The UUID of the machine to stop + uuid: String, + }, + Start { + /// The UUID of the machine to start + uuid: String, + }, + Pause { + /// The UUID of the machine to pause + uuid: String, + }, +} + fn main() { - println!("Hello, world!"); + color_eyre::install().unwrap(); + let args = Args::parse(); + let client = reqwest::blocking::Client::new(); + + let root = args.server.clone(); + + match args.action { + Action::List => { + list(args, client).unwrap(); + }, + Action::Stop { uuid } => { + stop(root, client, uuid).unwrap(); + }, + Action::Start { uuid } => { + start(root, client, uuid).unwrap(); + }, + Action::Pause { uuid } => { + pause(root, client, uuid).unwrap(); + } + }; +} + + +fn list(a: Args, c: Client) -> Result<(), CliError> { + let res: Vec<Planet> = c.get(format!("http://{}/planets/list", a.server)).send()?.json()?; + + let mut table = Table::new("{:<} {:<} {:<}"); + + table.add_row(row!( + "name", "uuid", "status") + ); + + for p in res { + table.add_row(row!( + &p.name, + &p.uuid, + if p.orbiting { "Running" } else { "Not running" }, + )); + } + + println!("{}", table); + + Ok(()) +} + +fn stop(server: String, c: Client, u: String) -> Result<(), CliError> { + let res = c.post(format!("http://{}/planets/{}/shutdown", server, u)).send()?; + + match res.status() { + StatusCode::OK => { + println!("Stopped."); + }, + _ => { + return Err(CliError::Cli(format!("Could not stop VM: {}", res.text()?))); + }, + }; + + Ok(()) +} + +fn start(server: String, c: Client, u: String) -> Result<(), CliError> { + let res = c.post(format!("http://{}/planets/{}/start", server, u)).send()?; + + match res.status() { + StatusCode::OK => { + println!("Started."); + }, + _ => { + return Err(CliError::Cli(format!("Could not start VM: {}", res.text()?))); + }, + }; + + Ok(()) +} + +fn pause(server: String, c: Client, u: String) -> Result<(), CliError> { + let res = c.post(format!("http://{}/planets/{}/pause", server, u)).send()?; + + match res.status() { + StatusCode::OK => { + println!("Paused."); + }, + _ => { + return Err(CliError::Cli(format!("Could not pause VM: {}", res.text()?))); + }, + }; + + Ok(()) } |