use clap::Parser;
use openstack_cli_core::cli::{CliArgs, CompletionCommand, GlobalOpts, parse_config, styles};
use openstack_cli_core::config::Config;
use openstack_cli_core::error::OpenStackCliError;
use openstack_sdk::AsyncOpenStack;
#[derive(Parser)]
#[command(name="osc", author, version, about, long_about, styles = styles())]
#[command(propagate_version = true)]
pub struct Cli {
#[command(flatten)]
pub global_opts: GlobalOpts,
#[command(subcommand)]
pub command: TopLevelCommands,
#[arg(hide = true, long("cli-config"), value_parser = parse_config, default_value_t = Config::new().expect("invalid config"))]
pub config: Config,
}
impl CliArgs for Cli {
fn global_opts(&self) -> &GlobalOpts {
&self.global_opts
}
fn config(&self) -> &Config {
&self.config
}
}
#[allow(missing_docs)]
#[derive(Parser)]
pub enum TopLevelCommands {
Api(openstack_cli_api::ApiCommand),
Auth(openstack_cli_auth::AuthCommand),
BlockStorage(openstack_cli_block_storage::v3::BlockStorageCommand),
Catalog(openstack_cli_catalog::CatalogCommand),
Compute(openstack_cli_compute::v2::ComputeCommand),
#[command(aliases = ["container-infrastructure-management", "container"])]
ContainerInfrastructure(
openstack_cli_container_infrastructure_management::v1::ContainerInfrastructureCommand,
),
Dns(openstack_cli_dns::v2::DnsCommand),
Identity(openstack_cli_identity::v3::IdentityCommand),
#[cfg(feature = "keystone_ng")]
Identity4(openstack_cli_identity::v4::IdentityCommand),
Image(openstack_cli_image::v2::ImageCommand),
LoadBalancer(openstack_cli_load_balancer::v2::LoadBalancerCommand),
Network(openstack_cli_network::v2::NetworkCommand),
ObjectStore(openstack_cli_object_store::v1::ObjectStoreCommand),
Placement(openstack_cli_placement::v1::PlacementCommand),
Completion(CompletionCommand),
}
impl Cli {
pub async fn take_action(&self, client: &mut AsyncOpenStack) -> Result<(), OpenStackCliError> {
match &self.command {
TopLevelCommands::Api(args) => args.take_action(self, client).await,
TopLevelCommands::Auth(args) => args.take_action(self, client).await,
TopLevelCommands::BlockStorage(args) => args.take_action(self, client).await,
TopLevelCommands::Catalog(args) => args.take_action(self, client).await,
TopLevelCommands::Compute(args) => args.take_action(self, client).await,
TopLevelCommands::ContainerInfrastructure(args) => args.take_action(self, client).await,
TopLevelCommands::Dns(args) => args.take_action(self, client).await,
TopLevelCommands::Identity(args) => args.take_action(self, client).await,
#[cfg(feature = "keystone_ng")]
TopLevelCommands::Identity4(args) => args.take_action(self, client).await,
TopLevelCommands::Image(args) => args.take_action(self, client).await,
TopLevelCommands::LoadBalancer(args) => args.take_action(self, client).await,
TopLevelCommands::Network(args) => args.take_action(self, client).await,
TopLevelCommands::ObjectStore(args) => args.take_action(self, client).await,
TopLevelCommands::Placement(args) => args.take_action(self, client).await,
TopLevelCommands::Completion(_) => unimplemented!(),
}
}
}