openstack_sdk_identity/v3/domain/user/role/
head.rs1use derive_builder::Builder;
24use http::{HeaderMap, HeaderName, HeaderValue};
25
26use openstack_sdk_core::api::rest_endpoint_prelude::*;
27
28use std::borrow::Cow;
29
30#[derive(Builder, Debug, Clone)]
31#[builder(setter(strip_option))]
32pub struct Request<'a> {
33 #[builder(default, setter(into))]
36 domain_id: Cow<'a, str>,
37
38 #[builder(default, setter(into))]
41 id: Cow<'a, str>,
42
43 #[builder(default, setter(into))]
46 user_id: Cow<'a, str>,
47
48 #[builder(setter(name = "_headers"), default, private)]
49 _headers: Option<HeaderMap>,
50}
51impl<'a> Request<'a> {
52 pub fn builder() -> RequestBuilder<'a> {
54 RequestBuilder::default()
55 }
56}
57
58impl<'a> RequestBuilder<'a> {
59 pub fn header<K, V>(&mut self, header_name: K, header_value: V) -> &mut Self
61 where
62 K: Into<HeaderName>,
63 V: Into<HeaderValue>,
64 {
65 self._headers
66 .get_or_insert(None)
67 .get_or_insert_with(HeaderMap::new)
68 .insert(header_name.into(), header_value.into());
69 self
70 }
71
72 pub fn headers<I, T>(&mut self, iter: I) -> &mut Self
74 where
75 I: Iterator<Item = T>,
76 T: Into<(Option<HeaderName>, HeaderValue)>,
77 {
78 self._headers
79 .get_or_insert(None)
80 .get_or_insert_with(HeaderMap::new)
81 .extend(iter.map(Into::into));
82 self
83 }
84}
85
86impl RestEndpoint for Request<'_> {
87 fn method(&self) -> http::Method {
88 http::Method::HEAD
89 }
90
91 fn endpoint(&self) -> Cow<'static, str> {
92 format!(
93 "domains/{domain_id}/users/{user_id}/roles/{id}",
94 domain_id = self.domain_id.as_ref(),
95 id = self.id.as_ref(),
96 user_id = self.user_id.as_ref(),
97 )
98 .into()
99 }
100
101 fn parameters(&self) -> QueryParams<'_> {
102 QueryParams::default()
103 }
104
105 fn service_type(&self) -> ServiceType {
106 ServiceType::Identity
107 }
108
109 fn response_key(&self) -> Option<Cow<'static, str>> {
110 None
111 }
112
113 fn request_headers(&self) -> Option<&HeaderMap> {
115 self._headers.as_ref()
116 }
117
118 fn api_version(&self) -> Option<ApiVersion> {
120 Some(ApiVersion::new(3, 0))
121 }
122}
123
124#[cfg(test)]
125mod tests {
126 use super::*;
127 use http::{HeaderName, HeaderValue};
128 use httpmock::MockServer;
129 #[cfg(feature = "sync")]
130 use openstack_sdk_core::api::RawQuery;
131 use openstack_sdk_core::test::client::FakeOpenStackClient;
132 use openstack_sdk_core::types::ServiceType;
133
134 #[test]
135 fn test_service_type() {
136 assert_eq!(
137 Request::builder().build().unwrap().service_type(),
138 ServiceType::Identity
139 );
140 }
141
142 #[test]
143 fn test_response_key() {
144 assert!(Request::builder().build().unwrap().response_key().is_none())
145 }
146
147 #[cfg(feature = "sync")]
148 #[test]
149 fn endpoint() {
150 let server = MockServer::start();
151 let client = FakeOpenStackClient::new(server.base_url());
152 let mock = server.mock(|when, then| {
153 when.method(httpmock::Method::HEAD).path(format!(
154 "/domains/{domain_id}/users/{user_id}/roles/{id}",
155 domain_id = "domain_id",
156 id = "id",
157 user_id = "user_id",
158 ));
159
160 then.status(200).header("content-type", "application/json");
161 });
162
163 let endpoint = Request::builder()
164 .domain_id("domain_id")
165 .id("id")
166 .user_id("user_id")
167 .build()
168 .unwrap();
169 let _ = endpoint.raw_query(&client).unwrap();
170 mock.assert();
171 }
172
173 #[cfg(feature = "sync")]
174 #[test]
175 fn endpoint_headers() {
176 let server = MockServer::start();
177 let client = FakeOpenStackClient::new(server.base_url());
178 let mock = server.mock(|when, then| {
179 when.method(httpmock::Method::HEAD)
180 .path(format!(
181 "/domains/{domain_id}/users/{user_id}/roles/{id}",
182 domain_id = "domain_id",
183 id = "id",
184 user_id = "user_id",
185 ))
186 .header("foo", "bar")
187 .header("not_foo", "not_bar");
188 then.status(200).header("content-type", "application/json");
189 });
190
191 let endpoint = Request::builder()
192 .domain_id("domain_id")
193 .id("id")
194 .user_id("user_id")
195 .headers(
196 [(
197 Some(HeaderName::from_static("foo")),
198 HeaderValue::from_static("bar"),
199 )]
200 .into_iter(),
201 )
202 .header(
203 HeaderName::from_static("not_foo"),
204 HeaderValue::from_static("not_bar"),
205 )
206 .build()
207 .unwrap();
208 let _ = endpoint.raw_query(&client).unwrap();
209 mock.assert();
210 }
211}