openstack_cli/network/v2/address_scope/
set.rs1use clap::Args;
23use tracing::info;
24
25use openstack_sdk::AsyncOpenStack;
26
27use crate::Cli;
28use crate::OpenStackCliError;
29use crate::output::OutputProcessor;
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::set::AddressScopeResponse;
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(
89 &self,
90 parsed_args: &Cli,
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 .expect("Resource ID is 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(address_scope_builder.build().unwrap());
129
130 let ep = ep_builder
131 .build()
132 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
133
134 let data = ep.query_async(client).await?;
135 op.output_single::<AddressScopeResponse>(data)?;
136 op.show_command_hint()?;
138 Ok(())
139 }
140}