use clap::Args;
use tracing::info;
use openstack_sdk::AsyncOpenStack;
use crate::Cli;
use crate::OpenStackCliError;
use crate::output::OutputProcessor;
use crate::common::parse_key_val;
use clap::ValueEnum;
use openstack_sdk::api::QueryAsync;
use openstack_sdk::api::dns::v2::zone::create;
use openstack_types::dns::v2::zone::response::create::ZoneResponse;
#[derive(Args)]
#[command(about = "Create Zone")]
pub struct ZoneCommand {
#[command(flatten)]
query: QueryParameters,
#[command(flatten)]
path: PathParameters,
#[arg(help_heading = "Body parameters", long, value_name="key=value", value_parser=parse_key_val::<String, String>)]
attributes: Option<Vec<(String, String)>>,
#[arg(help_heading = "Body parameters", long)]
description: Option<String>,
#[arg(help_heading = "Body parameters", long)]
email: Option<String>,
#[arg(action=clap::ArgAction::Append, help_heading = "Body parameters", long)]
masters: Option<Vec<String>>,
#[arg(help_heading = "Body parameters", long)]
name: Option<String>,
#[arg(help_heading = "Body parameters", long)]
ttl: Option<i32>,
#[arg(help_heading = "Body parameters", long)]
_type: Option<Type>,
}
#[derive(Args)]
struct QueryParameters {}
#[derive(Args)]
struct PathParameters {}
#[derive(Clone, Eq, Ord, PartialEq, PartialOrd, ValueEnum)]
enum Type {
Catalog,
Primary,
Secondary,
}
impl ZoneCommand {
pub async fn take_action(
&self,
parsed_args: &Cli,
client: &mut AsyncOpenStack,
) -> Result<(), OpenStackCliError> {
info!("Create Zone");
let op = OutputProcessor::from_args(parsed_args, Some("dns.zone"), Some("create"));
op.validate_args(parsed_args)?;
let mut ep_builder = create::Request::builder();
if let Some(arg) = &self.attributes {
ep_builder.attributes(arg.iter().cloned());
}
if let Some(arg) = &self.description {
ep_builder.description(arg);
}
if let Some(arg) = &self.email {
ep_builder.email(arg);
}
if let Some(arg) = &self.masters {
ep_builder.masters(arg.iter().map(Into::into).collect::<Vec<_>>());
}
if let Some(arg) = &self.name {
ep_builder.name(arg);
}
if let Some(arg) = &self.ttl {
ep_builder.ttl(*arg);
}
if let Some(arg) = &self._type {
let tmp = match arg {
Type::Catalog => create::Type::Catalog,
Type::Primary => create::Type::Primary,
Type::Secondary => create::Type::Secondary,
};
ep_builder._type(tmp);
}
let ep = ep_builder
.build()
.map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
let data = ep.query_async(client).await?;
op.output_single::<ZoneResponse>(data)?;
op.show_command_hint()?;
Ok(())
}
}