openstack_sdk/api/network/v2/subnetpool/
list.rs1use derive_builder::Builder;
42use http::{HeaderMap, HeaderName, HeaderValue};
43
44use crate::api::rest_endpoint_prelude::*;
45
46use crate::api::common::CommaSeparatedList;
47use std::borrow::Cow;
48
49use crate::api::Pageable;
50#[derive(Builder, Debug, Clone)]
51#[builder(setter(strip_option))]
52pub struct Request<'a> {
53 #[builder(default, setter(into))]
55 address_scope_id: Option<Cow<'a, str>>,
56
57 #[builder(default)]
59 default_prefixlen: Option<u32>,
60
61 #[builder(default)]
63 default_quota: Option<u32>,
64
65 #[builder(default, setter(into))]
67 description: Option<Cow<'a, str>>,
68
69 #[builder(default, setter(into))]
71 id: Option<Cow<'a, str>>,
72
73 #[builder(default, setter(into))]
75 ip_version: Option<Cow<'a, str>>,
76
77 #[builder(default)]
79 is_default: Option<bool>,
80
81 #[builder(default)]
86 limit: Option<u32>,
87
88 #[builder(default, setter(into))]
92 marker: Option<Cow<'a, str>>,
93
94 #[builder(default)]
96 max_prefixlen: Option<u32>,
97
98 #[builder(default)]
100 min_prefixlen: Option<u32>,
101
102 #[builder(default, setter(into))]
104 name: Option<Cow<'a, str>>,
105
106 #[builder(default, private, setter(name = "_not_tags"))]
108 not_tags: Option<CommaSeparatedList<Cow<'a, str>>>,
109
110 #[builder(default, private, setter(name = "_not_tags_any"))]
112 not_tags_any: Option<CommaSeparatedList<Cow<'a, str>>>,
113
114 #[builder(default)]
116 page_reverse: Option<bool>,
117
118 #[builder(default, setter(into))]
120 revision_number: Option<Cow<'a, str>>,
121
122 #[builder(default)]
124 shared: Option<bool>,
125
126 #[builder(default, private, setter(name = "_sort_dir"))]
129 sort_dir: Option<Vec<Cow<'a, str>>>,
130
131 #[builder(default, private, setter(name = "_sort_key"))]
134 sort_key: Option<Vec<Cow<'a, str>>>,
135
136 #[builder(default, private, setter(name = "_tags"))]
138 tags: Option<CommaSeparatedList<Cow<'a, str>>>,
139
140 #[builder(default, private, setter(name = "_tags_any"))]
142 tags_any: Option<CommaSeparatedList<Cow<'a, str>>>,
143
144 #[builder(default, setter(into))]
146 tenant_id: Option<Cow<'a, str>>,
147
148 #[builder(setter(name = "_headers"), default, private)]
149 _headers: Option<HeaderMap>,
150}
151impl<'a> Request<'a> {
152 pub fn builder() -> RequestBuilder<'a> {
154 RequestBuilder::default()
155 }
156}
157
158impl<'a> RequestBuilder<'a> {
159 pub fn sort_dir<I, T>(&mut self, iter: I) -> &mut Self
162 where
163 I: Iterator<Item = T>,
164 T: Into<Cow<'a, str>>,
165 {
166 self.sort_dir
167 .get_or_insert(None)
168 .get_or_insert_with(Vec::new)
169 .extend(iter.map(Into::into));
170 self
171 }
172
173 pub fn sort_key<I, T>(&mut self, iter: I) -> &mut Self
176 where
177 I: Iterator<Item = T>,
178 T: Into<Cow<'a, str>>,
179 {
180 self.sort_key
181 .get_or_insert(None)
182 .get_or_insert_with(Vec::new)
183 .extend(iter.map(Into::into));
184 self
185 }
186
187 pub fn not_tags<I, T>(&mut self, iter: I) -> &mut Self
189 where
190 I: Iterator<Item = T>,
191 T: Into<Cow<'a, str>>,
192 {
193 self.not_tags
194 .get_or_insert(None)
195 .get_or_insert_with(CommaSeparatedList::new)
196 .extend(iter.map(Into::into));
197 self
198 }
199
200 pub fn not_tags_any<I, T>(&mut self, iter: I) -> &mut Self
202 where
203 I: Iterator<Item = T>,
204 T: Into<Cow<'a, str>>,
205 {
206 self.not_tags_any
207 .get_or_insert(None)
208 .get_or_insert_with(CommaSeparatedList::new)
209 .extend(iter.map(Into::into));
210 self
211 }
212
213 pub fn tags<I, T>(&mut self, iter: I) -> &mut Self
215 where
216 I: Iterator<Item = T>,
217 T: Into<Cow<'a, str>>,
218 {
219 self.tags
220 .get_or_insert(None)
221 .get_or_insert_with(CommaSeparatedList::new)
222 .extend(iter.map(Into::into));
223 self
224 }
225
226 pub fn tags_any<I, T>(&mut self, iter: I) -> &mut Self
228 where
229 I: Iterator<Item = T>,
230 T: Into<Cow<'a, str>>,
231 {
232 self.tags_any
233 .get_or_insert(None)
234 .get_or_insert_with(CommaSeparatedList::new)
235 .extend(iter.map(Into::into));
236 self
237 }
238
239 pub fn header<K, V>(&mut self, header_name: K, header_value: V) -> &mut Self
241 where
242 K: Into<HeaderName>,
243 V: Into<HeaderValue>,
244 {
245 self._headers
246 .get_or_insert(None)
247 .get_or_insert_with(HeaderMap::new)
248 .insert(header_name.into(), header_value.into());
249 self
250 }
251
252 pub fn headers<I, T>(&mut self, iter: I) -> &mut Self
254 where
255 I: Iterator<Item = T>,
256 T: Into<(Option<HeaderName>, HeaderValue)>,
257 {
258 self._headers
259 .get_or_insert(None)
260 .get_or_insert_with(HeaderMap::new)
261 .extend(iter.map(Into::into));
262 self
263 }
264}
265
266impl RestEndpoint for Request<'_> {
267 fn method(&self) -> http::Method {
268 http::Method::GET
269 }
270
271 fn endpoint(&self) -> Cow<'static, str> {
272 "subnetpools".to_string().into()
273 }
274
275 fn parameters(&self) -> QueryParams<'_> {
276 let mut params = QueryParams::default();
277 params.push_opt("limit", self.limit);
278 params.push_opt("marker", self.marker.as_ref());
279 params.push_opt("page_reverse", self.page_reverse);
280 if let Some(val) = &self.sort_dir {
281 params.extend(val.iter().map(|value| ("sort_dir", value)));
282 }
283 if let Some(val) = &self.sort_key {
284 params.extend(val.iter().map(|value| ("sort_key", value)));
285 }
286 params.push_opt("address_scope_id", self.address_scope_id.as_ref());
287 params.push_opt("default_prefixlen", self.default_prefixlen);
288 params.push_opt("default_quota", self.default_quota);
289 params.push_opt("description", self.description.as_ref());
290 params.push_opt("id", self.id.as_ref());
291 params.push_opt("ip_version", self.ip_version.as_ref());
292 params.push_opt("is_default", self.is_default);
293 params.push_opt("max_prefixlen", self.max_prefixlen);
294 params.push_opt("min_prefixlen", self.min_prefixlen);
295 params.push_opt("name", self.name.as_ref());
296 params.push_opt("not-tags", self.not_tags.as_ref());
297 params.push_opt("not-tags-any", self.not_tags_any.as_ref());
298 params.push_opt("revision_number", self.revision_number.as_ref());
299 params.push_opt("shared", self.shared);
300 params.push_opt("tags", self.tags.as_ref());
301 params.push_opt("tags-any", self.tags_any.as_ref());
302 params.push_opt("tenant_id", self.tenant_id.as_ref());
303
304 params
305 }
306
307 fn service_type(&self) -> ServiceType {
308 ServiceType::Network
309 }
310
311 fn response_key(&self) -> Option<Cow<'static, str>> {
312 Some("subnetpools".into())
313 }
314
315 fn request_headers(&self) -> Option<&HeaderMap> {
317 self._headers.as_ref()
318 }
319
320 fn api_version(&self) -> Option<ApiVersion> {
322 Some(ApiVersion::new(2, 0))
323 }
324}
325impl Pageable for Request<'_> {}
326
327#[cfg(test)]
328mod tests {
329 use super::*;
330 #[cfg(feature = "sync")]
331 use crate::api::Query;
332 use crate::test::client::FakeOpenStackClient;
333 use crate::types::ServiceType;
334 use http::{HeaderName, HeaderValue};
335 use httpmock::MockServer;
336 use serde_json::json;
337
338 #[test]
339 fn test_service_type() {
340 assert_eq!(
341 Request::builder().build().unwrap().service_type(),
342 ServiceType::Network
343 );
344 }
345
346 #[test]
347 fn test_response_key() {
348 assert_eq!(
349 Request::builder().build().unwrap().response_key().unwrap(),
350 "subnetpools"
351 );
352 }
353
354 #[cfg(feature = "sync")]
355 #[test]
356 fn endpoint() {
357 let server = MockServer::start();
358 let client = FakeOpenStackClient::new(server.base_url());
359 let mock = server.mock(|when, then| {
360 when.method(httpmock::Method::GET)
361 .path("/subnetpools".to_string());
362
363 then.status(200)
364 .header("content-type", "application/json")
365 .json_body(json!({ "subnetpools": {} }));
366 });
367
368 let endpoint = Request::builder().build().unwrap();
369 let _: serde_json::Value = endpoint.query(&client).unwrap();
370 mock.assert();
371 }
372
373 #[cfg(feature = "sync")]
374 #[test]
375 fn endpoint_headers() {
376 let server = MockServer::start();
377 let client = FakeOpenStackClient::new(server.base_url());
378 let mock = server.mock(|when, then| {
379 when.method(httpmock::Method::GET)
380 .path("/subnetpools".to_string())
381 .header("foo", "bar")
382 .header("not_foo", "not_bar");
383 then.status(200)
384 .header("content-type", "application/json")
385 .json_body(json!({ "subnetpools": {} }));
386 });
387
388 let endpoint = Request::builder()
389 .headers(
390 [(
391 Some(HeaderName::from_static("foo")),
392 HeaderValue::from_static("bar"),
393 )]
394 .into_iter(),
395 )
396 .header(
397 HeaderName::from_static("not_foo"),
398 HeaderValue::from_static("not_bar"),
399 )
400 .build()
401 .unwrap();
402 let _: serde_json::Value = endpoint.query(&client).unwrap();
403 mock.assert();
404 }
405}