pub struct Cli { client: sdk::Client, over: T, } impl Cli { pub fn new(client: sdk::Client) -> Self { Self { client, over: () } } pub fn get_command(cmd: CliCommand) -> clap::Command { match cmd { CliCommand::InstanceGet => Self::cli_instance_get(), CliCommand::InstanceEnsure => Self::cli_instance_ensure(), CliCommand::InstanceIssueCrucibleSnapshotRequest => { Self::cli_instance_issue_crucible_snapshot_request() } CliCommand::InstanceMigrateStatus => Self::cli_instance_migrate_status(), CliCommand::InstanceSerial => Self::cli_instance_serial(), CliCommand::InstanceStatePut => Self::cli_instance_state_put(), CliCommand::InstanceStateMonitor => Self::cli_instance_state_monitor(), } } pub fn cli_instance_get() -> clap::Command { clap::Command::new("") } pub fn cli_instance_ensure() -> clap::Command { clap::Command::new("") .arg( clap::Arg::new("cloud-init-bytes") .long("cloud-init-bytes") .value_parser(clap::value_parser!(String)) .required(false), ) .arg( clap::Arg::new("json-body") .long("json-body") .value_name("JSON-FILE") .required(true) .value_parser(clap::value_parser!(std::path::PathBuf)) .help("Path to a file that contains the full json body."), ) .arg( clap::Arg::new("json-body-template") .long("json-body-template") .action(clap::ArgAction::SetTrue) .help("XXX"), ) } pub fn cli_instance_issue_crucible_snapshot_request() -> clap::Command { clap::Command::new("") .arg( clap::Arg::new("id") .long("id") .value_parser(clap::value_parser!(uuid::Uuid)) .required(true), ) .arg( clap::Arg::new("snapshot-id") .long("snapshot-id") .value_parser(clap::value_parser!(uuid::Uuid)) .required(true), ) .about("Issue a snapshot request to a crucible backend") } pub fn cli_instance_migrate_status() -> clap::Command { clap::Command::new("") .arg( clap::Arg::new("migration-id") .long("migration-id") .value_parser(clap::value_parser!(uuid::Uuid)) .required_unless_present("json-body"), ) .arg( clap::Arg::new("json-body") .long("json-body") .value_name("JSON-FILE") .required(false) .value_parser(clap::value_parser!(std::path::PathBuf)) .help("Path to a file that contains the full json body."), ) .arg( clap::Arg::new("json-body-template") .long("json-body-template") .action(clap::ArgAction::SetTrue) .help("XXX"), ) } pub fn cli_instance_serial() -> clap::Command { clap::Command::new("") } pub fn cli_instance_state_put() -> clap::Command { clap::Command::new("") .arg( clap::Arg::new("json-body") .long("json-body") .value_name("JSON-FILE") .required(true) .value_parser(clap::value_parser!(std::path::PathBuf)) .help("Path to a file that contains the full json body."), ) .arg( clap::Arg::new("json-body-template") .long("json-body-template") .action(clap::ArgAction::SetTrue) .help("XXX"), ) } pub fn cli_instance_state_monitor() -> clap::Command { clap::Command::new("") .arg( clap::Arg::new("gen") .long("gen") .value_parser(clap::value_parser!(u64)) .required_unless_present("json-body"), ) .arg( clap::Arg::new("json-body") .long("json-body") .value_name("JSON-FILE") .required(false) .value_parser(clap::value_parser!(std::path::PathBuf)) .help("Path to a file that contains the full json body."), ) .arg( clap::Arg::new("json-body-template") .long("json-body-template") .action(clap::ArgAction::SetTrue) .help("XXX"), ) } } impl Cli { pub fn new_with_override(client: sdk::Client, over: T) -> Self { Self { client, over } } pub async fn execute(&self, cmd: CliCommand, matches: &clap::ArgMatches) { match cmd { CliCommand::InstanceGet => { self.execute_instance_get(matches).await; } CliCommand::InstanceEnsure => { self.execute_instance_ensure(matches).await; } CliCommand::InstanceIssueCrucibleSnapshotRequest => { self.execute_instance_issue_crucible_snapshot_request(matches) .await; } CliCommand::InstanceMigrateStatus => { self.execute_instance_migrate_status(matches).await; } CliCommand::InstanceSerial => { self.execute_instance_serial(matches).await; } CliCommand::InstanceStatePut => { self.execute_instance_state_put(matches).await; } CliCommand::InstanceStateMonitor => { self.execute_instance_state_monitor(matches).await; } } } pub async fn execute_instance_get(&self, matches: &clap::ArgMatches) { let mut request = self.client.instance_get(); self.over .execute_instance_get(matches, &mut request) .unwrap(); let result = request.send().await; match result { Ok(r) => { println!("success\n{:#?}", r) } Err(r) => { println!("error\n{:#?}", r) } } } pub async fn execute_instance_ensure(&self, matches: &clap::ArgMatches) { let mut request = self.client.instance_ensure(); if let Some(value) = matches.get_one::("cloud-init-bytes") { request = request.body_map(|body| body.cloud_init_bytes(value.clone())) } if let Some(value) = matches.get_one::("json-body") { let body_txt = std::fs::read_to_string(value).unwrap(); let body_value = serde_json::from_str::(&body_txt).unwrap(); request = request.body(body_value); } self.over .execute_instance_ensure(matches, &mut request) .unwrap(); let result = request.send().await; match result { Ok(r) => { println!("success\n{:#?}", r) } Err(r) => { println!("error\n{:#?}", r) } } } pub async fn execute_instance_issue_crucible_snapshot_request( &self, matches: &clap::ArgMatches, ) { let mut request = self.client.instance_issue_crucible_snapshot_request(); if let Some(value) = matches.get_one::("id") { request = request.id(value.clone()); } if let Some(value) = matches.get_one::("snapshot-id") { request = request.snapshot_id(value.clone()); } self.over .execute_instance_issue_crucible_snapshot_request(matches, &mut request) .unwrap(); let result = request.send().await; match result { Ok(r) => { println!("success\n{:#?}", r) } Err(r) => { println!("error\n{:#?}", r) } } } pub async fn execute_instance_migrate_status(&self, matches: &clap::ArgMatches) { let mut request = self.client.instance_migrate_status(); if let Some(value) = matches.get_one::("migration-id") { request = request.body_map(|body| body.migration_id(value.clone())) } if let Some(value) = matches.get_one::("json-body") { let body_txt = std::fs::read_to_string(value).unwrap(); let body_value = serde_json::from_str::(&body_txt).unwrap(); request = request.body(body_value); } self.over .execute_instance_migrate_status(matches, &mut request) .unwrap(); let result = request.send().await; match result { Ok(r) => { println!("success\n{:#?}", r) } Err(r) => { println!("error\n{:#?}", r) } } } pub async fn execute_instance_serial(&self, matches: &clap::ArgMatches) { let mut request = self.client.instance_serial(); self.over .execute_instance_serial(matches, &mut request) .unwrap(); let result = request.send().await; match result { Ok(r) => { todo!() } Err(r) => { todo!() } } } pub async fn execute_instance_state_put(&self, matches: &clap::ArgMatches) { let mut request = self.client.instance_state_put(); if let Some(value) = matches.get_one::("json-body") { let body_txt = std::fs::read_to_string(value).unwrap(); let body_value = serde_json::from_str::(&body_txt).unwrap(); request = request.body(body_value); } self.over .execute_instance_state_put(matches, &mut request) .unwrap(); let result = request.send().await; match result { Ok(r) => { println!("success\n{:#?}", r) } Err(r) => { println!("error\n{:#?}", r) } } } pub async fn execute_instance_state_monitor(&self, matches: &clap::ArgMatches) { let mut request = self.client.instance_state_monitor(); if let Some(value) = matches.get_one::("gen") { request = request.body_map(|body| body.gen(value.clone())) } if let Some(value) = matches.get_one::("json-body") { let body_txt = std::fs::read_to_string(value).unwrap(); let body_value = serde_json::from_str::(&body_txt).unwrap(); request = request.body(body_value); } self.over .execute_instance_state_monitor(matches, &mut request) .unwrap(); let result = request.send().await; match result { Ok(r) => { println!("success\n{:#?}", r) } Err(r) => { println!("error\n{:#?}", r) } } } } pub trait CliOverride { fn execute_instance_get( &self, matches: &clap::ArgMatches, request: &mut builder::InstanceGet, ) -> Result<(), String> { Ok(()) } fn execute_instance_ensure( &self, matches: &clap::ArgMatches, request: &mut builder::InstanceEnsure, ) -> Result<(), String> { Ok(()) } fn execute_instance_issue_crucible_snapshot_request( &self, matches: &clap::ArgMatches, request: &mut builder::InstanceIssueCrucibleSnapshotRequest, ) -> Result<(), String> { Ok(()) } fn execute_instance_migrate_status( &self, matches: &clap::ArgMatches, request: &mut builder::InstanceMigrateStatus, ) -> Result<(), String> { Ok(()) } fn execute_instance_serial( &self, matches: &clap::ArgMatches, request: &mut builder::InstanceSerial, ) -> Result<(), String> { Ok(()) } fn execute_instance_state_put( &self, matches: &clap::ArgMatches, request: &mut builder::InstanceStatePut, ) -> Result<(), String> { Ok(()) } fn execute_instance_state_monitor( &self, matches: &clap::ArgMatches, request: &mut builder::InstanceStateMonitor, ) -> Result<(), String> { Ok(()) } } impl CliOverride for () {} #[derive(Copy, Clone, Debug)] pub enum CliCommand { InstanceGet, InstanceEnsure, InstanceIssueCrucibleSnapshotRequest, InstanceMigrateStatus, InstanceSerial, InstanceStatePut, InstanceStateMonitor, } impl CliCommand { pub fn iter() -> impl Iterator { vec![ CliCommand::InstanceGet, CliCommand::InstanceEnsure, CliCommand::InstanceIssueCrucibleSnapshotRequest, CliCommand::InstanceMigrateStatus, CliCommand::InstanceSerial, CliCommand::InstanceStatePut, CliCommand::InstanceStateMonitor, ] .into_iter() } }