openstack_cli_network/v2/address_scope/
set.rs1use clap::Args;
23use eyre::WrapErr;
24use tracing::info;
25
26use openstack_cli_core::cli::CliArgs;
27use openstack_cli_core::error::OpenStackCliError;
28use openstack_cli_core::output::OutputProcessor;
29use openstack_sdk::AsyncOpenStack;
30
31use openstack_sdk::api::QueryAsync;
32use openstack_sdk::api::find;
33use openstack_sdk::api::network::v2::address_scope::find;
34use openstack_sdk::api::network::v2::address_scope::set;
35use openstack_types::network::v2::address_scope::response;
36
37#[derive(Args)]
43#[command(about = "Update an address scope")]
44pub struct AddressScopeCommand {
45 #[command(flatten)]
47 query: QueryParameters,
48
49 #[command(flatten)]
51 path: PathParameters,
52
53 #[command(flatten)]
55 address_scope: AddressScope,
56}
57
58#[derive(Args)]
60struct QueryParameters {}
61
62#[derive(Args)]
64struct PathParameters {
65 #[arg(
67 help_heading = "Path parameters",
68 id = "path_param_id",
69 value_name = "ID"
70 )]
71 id: String,
72}
73#[derive(Args, Clone)]
75struct AddressScope {
76 #[arg(help_heading = "Body parameters", long)]
78 name: Option<String>,
79
80 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
83 shared: Option<bool>,
84}
85
86impl AddressScopeCommand {
87 pub async fn take_action<C: CliArgs>(
89 &self,
90 parsed_args: &C,
91 client: &mut AsyncOpenStack,
92 ) -> Result<(), OpenStackCliError> {
93 info!("Set AddressScope");
94
95 let op =
96 OutputProcessor::from_args(parsed_args, Some("network.address_scope"), Some("set"));
97 op.validate_args(parsed_args)?;
98
99 let mut find_builder = find::Request::builder();
100
101 find_builder.id(&self.path.id);
102
103 let find_ep = find_builder
104 .build()
105 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
106 let find_data: serde_json::Value = find(find_ep).query_async(client).await?;
107
108 let mut ep_builder = set::Request::builder();
109
110 let resource_id = find_data["id"]
111 .as_str()
112 .ok_or_else(|| eyre::eyre!("resource ID must be a string"))?
113 .to_string();
114 ep_builder.id(resource_id.clone());
115
116 let args = &self.address_scope;
119 let mut address_scope_builder = set::AddressScopeBuilder::default();
120 if let Some(val) = &args.name {
121 address_scope_builder.name(val);
122 }
123
124 if let Some(val) = &args.shared {
125 address_scope_builder.shared(*val);
126 }
127
128 ep_builder.address_scope(
129 address_scope_builder
130 .build()
131 .wrap_err("error preparing the request data")?,
132 );
133
134 let ep = ep_builder
135 .build()
136 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
137
138 let data: serde_json::Value = ep.query_async(client).await?;
139
140 op.output_single::<response::set::AddressScopeResponse>(data.clone())?;
141 op.show_command_hint()?;
143 Ok(())
144 }
145}