openstack_sdk_object_store/v1/object/
get.rs1use derive_builder::Builder;
23use http::{HeaderMap, HeaderName, HeaderValue};
24
25use openstack_sdk_core::api::rest_endpoint_prelude::*;
26
27use std::borrow::Cow;
28
29#[derive(Builder, Debug, Clone)]
30#[builder(setter(strip_option))]
31pub struct Request<'a> {
32 #[builder(default, setter(into))]
35 account: Cow<'a, str>,
36
37 #[builder(default, setter(into))]
45 container: Cow<'a, str>,
46
47 #[builder(default, setter(into))]
54 filename: Option<Cow<'a, str>>,
55
56 #[builder(default, setter(into))]
62 multipart_manifest: Option<Cow<'a, str>>,
63
64 #[builder(default, setter(into))]
66 object: Cow<'a, str>,
67
68 #[builder(default, setter(into))]
72 symlink: Option<Cow<'a, str>>,
73
74 #[builder(default)]
80 temp_url_expires: Option<i32>,
81
82 #[builder(default, setter(into))]
88 temp_url_sig: Option<Cow<'a, str>>,
89
90 #[builder(setter(name = "_headers"), default, private)]
91 _headers: Option<HeaderMap>,
92}
93impl<'a> Request<'a> {
94 pub fn builder() -> RequestBuilder<'a> {
96 RequestBuilder::default()
97 }
98}
99
100impl<'a> RequestBuilder<'a> {
101 pub fn header<K, V>(&mut self, header_name: K, header_value: V) -> &mut Self
103 where
104 K: Into<HeaderName>,
105 V: Into<HeaderValue>,
106 {
107 self._headers
108 .get_or_insert(None)
109 .get_or_insert_with(HeaderMap::new)
110 .insert(header_name.into(), header_value.into());
111 self
112 }
113
114 pub fn headers<I, T>(&mut self, iter: I) -> &mut Self
116 where
117 I: Iterator<Item = T>,
118 T: Into<(Option<HeaderName>, HeaderValue)>,
119 {
120 self._headers
121 .get_or_insert(None)
122 .get_or_insert_with(HeaderMap::new)
123 .extend(iter.map(Into::into));
124 self
125 }
126}
127
128impl RestEndpoint for Request<'_> {
129 fn method(&self) -> http::Method {
130 http::Method::GET
131 }
132
133 fn endpoint(&self) -> Cow<'static, str> {
134 format!(
135 "{account}/{container}/{object}",
136 account = self.account.as_ref(),
137 container = self.container.as_ref(),
138 object = self.object.as_ref(),
139 )
140 .into()
141 }
142
143 fn parameters(&self) -> QueryParams<'_> {
144 let mut params = QueryParams::default();
145 params.push_opt("multipart-manifest", self.multipart_manifest.as_ref());
146 params.push_opt("temp_url_sig", self.temp_url_sig.as_ref());
147 params.push_opt("temp_url_expires", self.temp_url_expires);
148 params.push_opt("filename", self.filename.as_ref());
149 params.push_opt("symlink", self.symlink.as_ref());
150
151 params
152 }
153
154 fn service_type(&self) -> ServiceType {
155 ServiceType::ObjectStore
156 }
157
158 fn response_key(&self) -> Option<Cow<'static, str>> {
159 None
160 }
161
162 fn request_headers(&self) -> Option<&HeaderMap> {
164 self._headers.as_ref()
165 }
166
167 fn api_version(&self) -> Option<ApiVersion> {
169 Some(ApiVersion::new(1, 0))
170 }
171}
172
173#[cfg(test)]
174mod tests {
175 use super::*;
176 use http::{HeaderName, HeaderValue};
177 use httpmock::MockServer;
178 #[cfg(feature = "sync")]
179 use openstack_sdk_core::api::Query;
180 use openstack_sdk_core::test::client::FakeOpenStackClient;
181 use openstack_sdk_core::types::ServiceType;
182 use serde_json::json;
183
184 #[test]
185 fn test_service_type() {
186 assert_eq!(
187 Request::builder().build().unwrap().service_type(),
188 ServiceType::ObjectStore
189 );
190 }
191
192 #[test]
193 fn test_response_key() {
194 assert!(Request::builder().build().unwrap().response_key().is_none())
195 }
196
197 #[cfg(feature = "sync")]
198 #[test]
199 fn endpoint() {
200 let server = MockServer::start();
201 let client = FakeOpenStackClient::new(server.base_url());
202 let mock = server.mock(|when, then| {
203 when.method(httpmock::Method::GET).path(format!(
204 "/{account}/{container}/{object}",
205 account = "account",
206 container = "container",
207 object = "object",
208 ));
209
210 then.status(200)
211 .header("content-type", "application/json")
212 .json_body(json!({ "dummy": {} }));
213 });
214
215 let endpoint = Request::builder()
216 .account("account")
217 .container("container")
218 .object("object")
219 .build()
220 .unwrap();
221 let _: serde_json::Value = endpoint.query(&client).unwrap();
222 mock.assert();
223 }
224
225 #[cfg(feature = "sync")]
226 #[test]
227 fn endpoint_headers() {
228 let server = MockServer::start();
229 let client = FakeOpenStackClient::new(server.base_url());
230 let mock = server.mock(|when, then| {
231 when.method(httpmock::Method::GET)
232 .path(format!(
233 "/{account}/{container}/{object}",
234 account = "account",
235 container = "container",
236 object = "object",
237 ))
238 .header("foo", "bar")
239 .header("not_foo", "not_bar");
240 then.status(200)
241 .header("content-type", "application/json")
242 .json_body(json!({ "dummy": {} }));
243 });
244
245 let endpoint = Request::builder()
246 .account("account")
247 .container("container")
248 .object("object")
249 .headers(
250 [(
251 Some(HeaderName::from_static("foo")),
252 HeaderValue::from_static("bar"),
253 )]
254 .into_iter(),
255 )
256 .header(
257 HeaderName::from_static("not_foo"),
258 HeaderValue::from_static("not_bar"),
259 )
260 .build()
261 .unwrap();
262 let _: serde_json::Value = endpoint.query(&client).unwrap();
263 mock.assert();
264 }
265}