xapi-shared 0.0.1

XAPI Shared Library
Documentation
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(),
            );
        }
    }
}