openstack_cli_dns/v2/zone/recordset/
delete.rs1use clap::Args;
23use tracing::info;
24
25use openstack_cli_core::cli::CliArgs;
26use openstack_cli_core::error::OpenStackCliError;
27use openstack_cli_core::output::OutputProcessor;
28use openstack_sdk::AsyncOpenStack;
29
30use openstack_sdk::api::QueryAsync;
31use openstack_sdk::api::dns::v2::zone::find as find_zone;
32use openstack_sdk::api::dns::v2::zone::recordset::delete;
33use openstack_sdk::api::find_by_name;
34use tracing::warn;
35
36#[derive(Args)]
38#[command(about = "Delete a Recordset")]
39pub struct RecordsetCommand {
40 #[command(flatten)]
42 query: QueryParameters,
43
44 #[command(flatten)]
46 path: PathParameters,
47}
48
49#[derive(Args)]
51struct QueryParameters {}
52
53#[derive(Args)]
55struct PathParameters {
56 #[arg(
59 help_heading = "Path parameters",
60 id = "path_param_id",
61 value_name = "ID"
62 )]
63 id: String,
64
65 #[command(flatten)]
67 zone: ZoneInput,
68}
69
70#[derive(Args)]
72#[group(required = true, multiple = false)]
73struct ZoneInput {
74 #[arg(long, help_heading = "Path parameters", value_name = "ZONE_NAME")]
76 zone_name: Option<String>,
77 #[arg(long, help_heading = "Path parameters", value_name = "ZONE_ID")]
79 zone_id: Option<String>,
80}
81
82impl RecordsetCommand {
83 pub async fn take_action<C: CliArgs>(
85 &self,
86 parsed_args: &C,
87 client: &mut AsyncOpenStack,
88 ) -> Result<(), OpenStackCliError> {
89 info!("Delete Recordset");
90
91 let op =
92 OutputProcessor::from_args(parsed_args, Some("dns.zone/recordset"), Some("delete"));
93 op.validate_args(parsed_args)?;
94
95 let mut ep_builder = delete::Request::builder();
96
97 ep_builder.id(&self.path.id);
98
99 if let Some(id) = &self.path.zone.zone_id {
101 ep_builder.zone_id(id);
103 } else if let Some(name) = &self.path.zone.zone_name {
104 let mut sub_find_builder = find_zone::Request::builder();
106 warn!(
107 "Querying zone by name (because of `--zone-name` parameter passed) may not be definite. This may fail in which case parameter `--zone-id` should be used instead."
108 );
109
110 sub_find_builder.id(name);
111 let find_ep = sub_find_builder
112 .build()
113 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
114 let find_data: serde_json::Value = find_by_name(find_ep).query_async(client).await?;
115 match find_data.get("id") {
117 Some(val) => match val.as_str() {
118 Some(id_str) => {
119 ep_builder.zone_id(id_str.to_owned());
120 }
121 None => {
122 return Err(OpenStackCliError::ResourceAttributeNotString(
123 serde_json::to_string(&val)?,
124 ));
125 }
126 },
127 None => {
128 return Err(OpenStackCliError::ResourceAttributeMissing(
129 "id".to_string(),
130 ));
131 }
132 };
133 }
134
135 let ep = ep_builder
136 .build()
137 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
138 openstack_sdk::api::ignore(ep).query_async(client).await?;
139 op.show_command_hint()?;
141 Ok(())
142 }
143}