xapi_shared/rest/
payload.rs

1use 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}