openstack_cli_placement/v1/trait/
list.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::placement::v1::r#trait::list;
32use openstack_types::placement::v1::r#trait::response;
33
34#[derive(Args)]
38#[command(about = "List traits")]
39pub struct TraitsCommand {
40 #[command(flatten)]
42 query: QueryParameters,
43
44 #[command(flatten)]
46 path: PathParameters,
47}
48
49#[derive(Args)]
51struct QueryParameters {
52 #[arg(action=clap::ArgAction::SetTrue, help_heading = "Query parameters", long)]
56 associated: Option<bool>,
57
58 #[arg(help_heading = "Query parameters", long)]
60 name: Option<String>,
61}
62
63#[derive(Args)]
65struct PathParameters {}
66
67impl TraitsCommand {
68 pub async fn take_action<C: CliArgs>(
70 &self,
71 parsed_args: &C,
72 client: &mut AsyncOpenStack,
73 ) -> Result<(), OpenStackCliError> {
74 info!("List Traits");
75
76 let op = OutputProcessor::from_args(parsed_args, Some("placement.trait"), Some("list"));
77 op.validate_args(parsed_args)?;
78
79 let mut ep_builder = list::Request::builder();
80
81 if let Some(val) = &self.query.associated {
83 ep_builder.associated(*val);
84 }
85 if let Some(val) = &self.query.name {
86 ep_builder.name(val);
87 }
88
89 let ep = ep_builder
90 .build()
91 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
92
93 let data: Vec<serde_json::Value> = ep.query_async(client).await?;
94
95 op.output_list::<response::list::TraitResponse>(data.clone())?;
96 op.show_command_hint()?;
98 Ok(())
99 }
100}