openstack_cli_image/v2/metadef/namespace/
set.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 clap::ValueEnum;
31use openstack_cli_core::common::parse_key_val;
32use openstack_sdk::api::QueryAsync;
33use openstack_sdk::api::image::v2::metadef::namespace::set;
34use openstack_types::image::v2::metadef::namespace::response;
35use serde_json::Value;
36
37#[derive(Args)]
39pub struct NamespaceCommand {
40 #[command(flatten)]
42 query: QueryParameters,
43
44 #[command(flatten)]
46 path: PathParameters,
47
48 #[arg(help_heading = "Body parameters", long)]
50 description: Option<String>,
51
52 #[arg(help_heading = "Body parameters", long)]
54 display_name: Option<String>,
55
56 #[arg(help_heading = "Body parameters", long)]
58 namespace: String,
59
60 #[arg(action=clap::ArgAction::Append, help_heading = "Body parameters", long, value_name="JSON", value_parser=openstack_cli_core::common::parse_json)]
62 objects: Option<Vec<Value>>,
63
64 #[arg(help_heading = "Body parameters", long)]
66 owner: Option<String>,
67
68 #[arg(help_heading = "Body parameters", long, value_name="key=value", value_parser=parse_key_val::<String, Value>)]
69 properties: Option<Vec<(String, Value)>>,
70
71 #[arg(action=clap::ArgAction::Set, help_heading = "Body parameters", long)]
73 protected: Option<bool>,
74
75 #[arg(action=clap::ArgAction::Append, help_heading = "Body parameters", long, value_name="JSON", value_parser=openstack_cli_core::common::parse_json)]
77 resource_type_associations: Option<Vec<Value>>,
78
79 #[arg(action=clap::ArgAction::Append, help_heading = "Body parameters", long)]
81 tags: Option<Vec<String>>,
82
83 #[arg(help_heading = "Body parameters", long)]
85 visibility: Option<Visibility>,
86}
87
88#[derive(Args)]
90struct QueryParameters {}
91
92#[derive(Args)]
94struct PathParameters {
95 #[arg(
98 help_heading = "Path parameters",
99 id = "path_param_namespace_name",
100 value_name = "NAMESPACE_NAME"
101 )]
102 namespace_name: String,
103}
104
105#[derive(Clone, Eq, Ord, PartialEq, PartialOrd, ValueEnum)]
106enum Visibility {
107 Private,
108 Public,
109}
110
111impl NamespaceCommand {
112 pub async fn take_action<C: CliArgs>(
114 &self,
115 parsed_args: &C,
116 client: &mut AsyncOpenStack,
117 ) -> Result<(), OpenStackCliError> {
118 info!("Set Namespace");
119
120 let op =
121 OutputProcessor::from_args(parsed_args, Some("image.metadef/namespace"), Some("set"));
122 op.validate_args(parsed_args)?;
123
124 let mut ep_builder = set::Request::builder();
125
126 ep_builder.namespace_name(&self.path.namespace_name);
127
128 if let Some(arg) = &self.description {
131 ep_builder.description(arg);
132 }
133
134 if let Some(arg) = &self.display_name {
136 ep_builder.display_name(arg);
137 }
138
139 ep_builder.namespace(&self.namespace);
141
142 if let Some(arg) = &self.objects {
144 let objects_builder: Vec<set::Objects> = arg
145 .iter()
146 .flat_map(|v| serde_json::from_value::<set::Objects>(v.to_owned()))
147 .collect::<Vec<set::Objects>>();
148 ep_builder.objects(objects_builder);
149 }
150
151 if let Some(arg) = &self.owner {
153 ep_builder.owner(arg);
154 }
155
156 if let Some(arg) = &self.properties {
158 ep_builder.properties(
159 arg.iter()
160 .map(|(k, v)| {
161 serde_json::from_value(v.to_owned()).map(|v: set::Properties| (k, v))
162 })
163 .collect::<Result<Vec<_>, _>>()?
164 .into_iter(),
165 );
166 }
167
168 if let Some(arg) = &self.protected {
170 ep_builder.protected(*arg);
171 }
172
173 if let Some(arg) = &self.resource_type_associations {
175 let resource_type_associations_builder: Vec<set::ResourceTypeAssociations> = arg
176 .iter()
177 .flat_map(|v| serde_json::from_value::<set::ResourceTypeAssociations>(v.to_owned()))
178 .collect::<Vec<set::ResourceTypeAssociations>>();
179 ep_builder.resource_type_associations(resource_type_associations_builder);
180 }
181
182 if let Some(arg) = &self.tags {
184 let tags_builder: Vec<set::Tags> = arg
185 .iter()
186 .flat_map(|v| set::TagsBuilder::default().name(v).build())
187 .collect();
188 ep_builder.tags(tags_builder);
189 }
190
191 if let Some(arg) = &self.visibility {
193 let tmp = match arg {
194 Visibility::Private => set::Visibility::Private,
195 Visibility::Public => set::Visibility::Public,
196 };
197 ep_builder.visibility(tmp);
198 }
199
200 let ep = ep_builder
201 .build()
202 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
203
204 let data: serde_json::Value = ep.query_async(client).await?;
205
206 op.output_single::<response::set::NamespaceResponse>(data.clone())?;
207 op.show_command_hint()?;
209 Ok(())
210 }
211}