openstack_sdk/api/identity/v3/project/group/role/
delete.rs1use derive_builder::Builder;
24use http::{HeaderMap, HeaderName, HeaderValue};
25
26use crate::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 group_id: Cow<'a, str>,
37
38 #[builder(default, setter(into))]
41 id: Cow<'a, str>,
42
43 #[builder(default, setter(into))]
46 project_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::DELETE
89 }
90
91 fn endpoint(&self) -> Cow<'static, str> {
92 format!(
93 "projects/{project_id}/groups/{group_id}/roles/{id}",
94 group_id = self.group_id.as_ref(),
95 project_id = self.project_id.as_ref(),
96 id = self.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 #[cfg(feature = "sync")]
128 use crate::api::Query;
129 use crate::test::client::FakeOpenStackClient;
130 use crate::types::ServiceType;
131 use http::{HeaderName, HeaderValue};
132 use httpmock::MockServer;
133 use serde_json::json;
134
135 #[test]
136 fn test_service_type() {
137 assert_eq!(
138 Request::builder().build().unwrap().service_type(),
139 ServiceType::Identity
140 );
141 }
142
143 #[test]
144 fn test_response_key() {
145 assert!(Request::builder().build().unwrap().response_key().is_none())
146 }
147
148 #[cfg(feature = "sync")]
149 #[test]
150 fn endpoint() {
151 let server = MockServer::start();
152 let client = FakeOpenStackClient::new(server.base_url());
153 let mock = server.mock(|when, then| {
154 when.method(httpmock::Method::DELETE).path(format!(
155 "/projects/{project_id}/groups/{group_id}/roles/{id}",
156 group_id = "group_id",
157 project_id = "project_id",
158 id = "id",
159 ));
160
161 then.status(200)
162 .header("content-type", "application/json")
163 .json_body(json!({ "dummy": {} }));
164 });
165
166 let endpoint = Request::builder()
167 .group_id("group_id")
168 .project_id("project_id")
169 .id("id")
170 .build()
171 .unwrap();
172 let _: serde_json::Value = endpoint.query(&client).unwrap();
173 mock.assert();
174 }
175
176 #[cfg(feature = "sync")]
177 #[test]
178 fn endpoint_headers() {
179 let server = MockServer::start();
180 let client = FakeOpenStackClient::new(server.base_url());
181 let mock = server.mock(|when, then| {
182 when.method(httpmock::Method::DELETE)
183 .path(format!(
184 "/projects/{project_id}/groups/{group_id}/roles/{id}",
185 group_id = "group_id",
186 project_id = "project_id",
187 id = "id",
188 ))
189 .header("foo", "bar")
190 .header("not_foo", "not_bar");
191 then.status(200)
192 .header("content-type", "application/json")
193 .json_body(json!({ "dummy": {} }));
194 });
195
196 let endpoint = Request::builder()
197 .group_id("group_id")
198 .project_id("project_id")
199 .id("id")
200 .headers(
201 [(
202 Some(HeaderName::from_static("foo")),
203 HeaderValue::from_static("bar"),
204 )]
205 .into_iter(),
206 )
207 .header(
208 HeaderName::from_static("not_foo"),
209 HeaderValue::from_static("not_bar"),
210 )
211 .build()
212 .unwrap();
213 let _: serde_json::Value = endpoint.query(&client).unwrap();
214 mock.assert();
215 }
216}