Skip to main content

openstack_sdk_identity/v3/registered_limit/
create.rs

1// Licensed under the Apache License, Version 2.0 (the "License");
2// you may not use this file except in compliance with the License.
3// You may obtain a copy of the License at
4//
5//     http://www.apache.org/licenses/LICENSE-2.0
6//
7// Unless required by applicable law or agreed to in writing, software
8// distributed under the License is distributed on an "AS IS" BASIS,
9// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10// See the License for the specific language governing permissions and
11// limitations under the License.
12//
13// SPDX-License-Identifier: Apache-2.0
14//
15// WARNING: This file is automatically generated from OpenAPI schema using
16// `openstack-codegenerator`.
17
18//! Creates registered limits. It supports to create more than one registered
19//! limit in one request.
20//!
21//! Relationship:
22//! `https://docs.openstack.org/api/openstack-identity/3/rel/registered_limits`
23//!
24use derive_builder::Builder;
25use http::{HeaderMap, HeaderName, HeaderValue};
26
27use openstack_sdk_core::api::rest_endpoint_prelude::*;
28
29use serde::Deserialize;
30use serde::Serialize;
31use std::borrow::Cow;
32
33#[derive(Builder, Debug, Deserialize, Clone, Serialize)]
34#[builder(setter(strip_option))]
35pub struct RegisteredLimits<'a> {
36    /// The default limit for the registered limit.
37    #[serde()]
38    #[builder(setter(into))]
39    pub(crate) default_limit: i32,
40
41    /// The registered limit description.
42    #[serde(skip_serializing_if = "Option::is_none")]
43    #[builder(default, setter(into))]
44    pub(crate) description: Option<Option<Cow<'a, str>>>,
45
46    /// The ID of the region that contains the service endpoint.
47    #[serde(skip_serializing_if = "Option::is_none")]
48    #[builder(default, setter(into))]
49    pub(crate) region_id: Option<Option<Cow<'a, str>>>,
50
51    /// The resource name.
52    #[serde()]
53    #[builder(setter(into))]
54    pub(crate) resource_name: Cow<'a, str>,
55
56    /// The UUID of the service to which the registered limit belongs.
57    #[serde()]
58    #[builder(setter(into))]
59    pub(crate) service_id: Cow<'a, str>,
60}
61
62#[derive(Builder, Debug, Clone)]
63#[builder(setter(strip_option))]
64pub struct Request<'a> {
65    /// A list of `registered_limits` objects
66    #[builder(setter(into))]
67    pub(crate) registered_limits: Vec<RegisteredLimits<'a>>,
68
69    #[builder(setter(name = "_headers"), default, private)]
70    _headers: Option<HeaderMap>,
71}
72impl<'a> Request<'a> {
73    /// Create a builder for the endpoint.
74    pub fn builder() -> RequestBuilder<'a> {
75        RequestBuilder::default()
76    }
77}
78
79impl<'a> RequestBuilder<'a> {
80    /// Add a single header to the Registered_Limit.
81    pub fn header<K, V>(&mut self, header_name: K, header_value: V) -> &mut Self
82    where
83        K: Into<HeaderName>,
84        V: Into<HeaderValue>,
85    {
86        self._headers
87            .get_or_insert(None)
88            .get_or_insert_with(HeaderMap::new)
89            .insert(header_name.into(), header_value.into());
90        self
91    }
92
93    /// Add multiple headers.
94    pub fn headers<I, T>(&mut self, iter: I) -> &mut Self
95    where
96        I: Iterator<Item = T>,
97        T: Into<(Option<HeaderName>, HeaderValue)>,
98    {
99        self._headers
100            .get_or_insert(None)
101            .get_or_insert_with(HeaderMap::new)
102            .extend(iter.map(Into::into));
103        self
104    }
105}
106
107impl RestEndpoint for Request<'_> {
108    fn method(&self) -> http::Method {
109        http::Method::POST
110    }
111
112    fn endpoint(&self) -> Cow<'static, str> {
113        "registered_limits".to_string().into()
114    }
115
116    fn parameters(&self) -> QueryParams<'_> {
117        QueryParams::default()
118    }
119
120    fn body(&self) -> Result<Option<(&'static str, Vec<u8>)>, BodyError> {
121        let mut params = JsonBodyParams::default();
122
123        params.push(
124            "registered_limits",
125            serde_json::to_value(&self.registered_limits)?,
126        );
127
128        params.into_body()
129    }
130
131    fn service_type(&self) -> ServiceType {
132        ServiceType::Identity
133    }
134
135    fn response_key(&self) -> Option<Cow<'static, str>> {
136        Some("registered_limits".into())
137    }
138
139    /// Returns headers to be set into the request
140    fn request_headers(&self) -> Option<&HeaderMap> {
141        self._headers.as_ref()
142    }
143
144    /// Returns required API version
145    fn api_version(&self) -> Option<ApiVersion> {
146        Some(ApiVersion::new(3, 0))
147    }
148}
149
150#[cfg(test)]
151mod tests {
152    use super::*;
153    use http::{HeaderName, HeaderValue};
154    use httpmock::MockServer;
155    #[cfg(feature = "sync")]
156    use openstack_sdk_core::api::Query;
157    use openstack_sdk_core::test::client::FakeOpenStackClient;
158    use openstack_sdk_core::types::ServiceType;
159    use serde_json::json;
160
161    #[test]
162    fn test_service_type() {
163        assert_eq!(
164            Request::builder()
165                .registered_limits(Vec::from([RegisteredLimitsBuilder::default()
166                    .default_limit(123)
167                    .resource_name("foo")
168                    .service_id("foo")
169                    .build()
170                    .unwrap()]))
171                .build()
172                .unwrap()
173                .service_type(),
174            ServiceType::Identity
175        );
176    }
177
178    #[test]
179    fn test_response_key() {
180        assert_eq!(
181            Request::builder()
182                .registered_limits(Vec::from([RegisteredLimitsBuilder::default()
183                    .default_limit(123)
184                    .resource_name("foo")
185                    .service_id("foo")
186                    .build()
187                    .unwrap()]))
188                .build()
189                .unwrap()
190                .response_key()
191                .unwrap(),
192            "registered_limits"
193        );
194    }
195
196    #[cfg(feature = "sync")]
197    #[test]
198    fn endpoint() {
199        let server = MockServer::start();
200        let client = FakeOpenStackClient::new(server.base_url());
201        let mock = server.mock(|when, then| {
202            when.method(httpmock::Method::POST)
203                .path("/registered_limits".to_string());
204
205            then.status(200)
206                .header("content-type", "application/json")
207                .json_body(json!({ "registered_limits": {} }));
208        });
209
210        let endpoint = Request::builder()
211            .registered_limits(Vec::from([RegisteredLimitsBuilder::default()
212                .default_limit(123)
213                .resource_name("foo")
214                .service_id("foo")
215                .build()
216                .unwrap()]))
217            .build()
218            .unwrap();
219        let _: serde_json::Value = endpoint.query(&client).unwrap();
220        mock.assert();
221    }
222
223    #[cfg(feature = "sync")]
224    #[test]
225    fn endpoint_headers() {
226        let server = MockServer::start();
227        let client = FakeOpenStackClient::new(server.base_url());
228        let mock = server.mock(|when, then| {
229            when.method(httpmock::Method::POST)
230                .path("/registered_limits".to_string())
231                .header("foo", "bar")
232                .header("not_foo", "not_bar");
233            then.status(200)
234                .header("content-type", "application/json")
235                .json_body(json!({ "registered_limits": {} }));
236        });
237
238        let endpoint = Request::builder()
239            .registered_limits(Vec::from([RegisteredLimitsBuilder::default()
240                .default_limit(123)
241                .resource_name("foo")
242                .service_id("foo")
243                .build()
244                .unwrap()]))
245            .headers(
246                [(
247                    Some(HeaderName::from_static("foo")),
248                    HeaderValue::from_static("bar"),
249                )]
250                .into_iter(),
251            )
252            .header(
253                HeaderName::from_static("not_foo"),
254                HeaderValue::from_static("not_bar"),
255            )
256            .build()
257            .unwrap();
258        let _: serde_json::Value = endpoint.query(&client).unwrap();
259        mock.assert();
260    }
261}