xapi_shared/rest/
payload.rs1use http::Method;
2use reqwest::Request;
3use serde::Serialize;
4
5impl<T: Serialize> SharedRestPayloadTrait for T {}
6
7pub trait SharedRestPayloadTrait: Serialize {
8 fn build_request(&self, request: &mut Request) {
9 match *request.method() {
10 Method::GET => self.build_get_request(request),
11 Method::POST => self.build_post_request(request),
12 _ => {
13 panic!("Unsupported HTTP method for request payload");
14 }
15 }
16 }
17
18 fn build_get_request(&self, request: &mut Request) {
19 let payload_query = serde_urlencoded::to_string(self).unwrap();
20 if !payload_query.is_empty() {
21 let mut url = request.url().clone();
22
23 let existing_query = url.query().unwrap_or("");
24
25 let combined_query = if existing_query.is_empty() {
26 payload_query
27 } else {
28 format!("{}&{}", existing_query, payload_query)
29 };
30
31 url.set_query(Some(&combined_query));
32 *request.url_mut() = url;
33 }
34 }
35
36 fn build_post_request(&self, request: &mut Request) {
37 if let Some(body) = request.body_mut() {
38 *body = reqwest::Body::from(
39 serde_json::to_string(self)
40 .inspect_err(|err| tracing::error!("failed to parse {err}"))
41 .unwrap(),
42 );
43 }
44 }
45}