openstack_cli_network/v2/segment/
create.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::network::v2::segment::create;
33use openstack_types::network::v2::segment::response;
34
35#[derive(Args)]
41#[command(about = "Create segment")]
42pub struct SegmentCommand {
43 #[command(flatten)]
45 query: QueryParameters,
46
47 #[command(flatten)]
49 path: PathParameters,
50
51 #[command(flatten)]
52 segment: Segment,
53}
54
55#[derive(Args)]
57struct QueryParameters {}
58
59#[derive(Args)]
61struct PathParameters {}
62#[derive(Args, Clone)]
64struct Segment {
65 #[arg(help_heading = "Body parameters", long)]
68 description: Option<String>,
69
70 #[arg(help_heading = "Body parameters", long)]
72 name: Option<String>,
73
74 #[arg(help_heading = "Body parameters", long, action = clap::ArgAction::SetTrue, conflicts_with = "name")]
76 no_name: bool,
77
78 #[arg(help_heading = "Body parameters", long)]
80 network_id: Option<String>,
81
82 #[arg(help_heading = "Body parameters", long)]
85 network_type: Option<String>,
86
87 #[arg(help_heading = "Body parameters", long)]
89 physical_network: Option<String>,
90
91 #[arg(help_heading = "Body parameters", long)]
97 segmentation_id: Option<String>,
98
99 #[arg(help_heading = "Body parameters", long)]
100 tenant_id: Option<String>,
101}
102
103impl SegmentCommand {
104 pub async fn take_action<C: CliArgs>(
106 &self,
107 parsed_args: &C,
108 client: &mut AsyncOpenStack,
109 ) -> Result<(), OpenStackCliError> {
110 info!("Create Segment");
111
112 let op = OutputProcessor::from_args(parsed_args, Some("network.segment"), Some("create"));
113 op.validate_args(parsed_args)?;
114
115 let mut ep_builder = create::Request::builder();
116
117 let args = &self.segment;
120 let mut segment_builder = create::SegmentBuilder::default();
121 if let Some(val) = &args.description {
122 segment_builder.description(val);
123 }
124
125 if let Some(val) = &args.name {
126 segment_builder.name(Some(val.into()));
127 } else if args.no_name {
128 segment_builder.name(None);
129 }
130
131 if let Some(val) = &args.network_id {
132 segment_builder.network_id(val);
133 }
134
135 if let Some(val) = &args.network_type {
136 segment_builder.network_type(val);
137 }
138
139 if let Some(val) = &args.physical_network {
140 segment_builder.physical_network(val);
141 }
142
143 if let Some(val) = &args.segmentation_id {
144 segment_builder.segmentation_id(val);
145 }
146
147 if let Some(val) = &args.tenant_id {
148 segment_builder.tenant_id(val);
149 }
150
151 ep_builder.segment(
152 segment_builder
153 .build()
154 .wrap_err("error preparing the request data")?,
155 );
156
157 let ep = ep_builder
158 .build()
159 .map_err(|x| OpenStackCliError::EndpointBuild(x.to_string()))?;
160
161 let data: serde_json::Value = ep.query_async(client).await?;
162
163 op.output_single::<response::create::SegmentResponse>(data.clone())?;
164 op.show_command_hint()?;
166 Ok(())
167 }
168}