use http::Method;
use reqwest::Request;
use serde::Serialize;
impl<T: Serialize> SharedRestPayloadTrait for T {}
pub trait SharedRestPayloadTrait: Serialize {
fn build_request(&self, request: &mut Request) {
match *request.method() {
Method::GET => self.build_get_request(request),
Method::POST => self.build_post_request(request),
_ => {
panic!("Unsupported HTTP method for request payload");
}
}
}
fn build_get_request(&self, request: &mut Request) {
let payload_query = serde_urlencoded::to_string(self).unwrap();
if !payload_query.is_empty() {
let mut url = request.url().clone();
let existing_query = url.query().unwrap_or("");
let combined_query = if existing_query.is_empty() {
payload_query
} else {
format!("{}&{}", existing_query, payload_query)
};
url.set_query(Some(&combined_query));
*request.url_mut() = url;
}
}
fn build_post_request(&self, request: &mut Request) {
if let Some(body) = request.body_mut() {
*body = reqwest::Body::from(
serde_json::to_string(self)
.inspect_err(|err| tracing::error!("failed to parse {err}"))
.unwrap(),
);
}
}
}