beyond 0.1.0

Easily execute rust functions on an external machine instead of locally.
Documentation
use base64::prelude::*;
use serde::{Deserialize, Serialize};

use crate::Error;

pub fn encode_request<R: Serialize>(request: R) -> Result<String, Error> {
    let json_request = serde_json::to_string(&request).map_err(Error::SerializeRequest)?;
    let base64_request = BASE64_STANDARD.encode(json_request);
    Ok(base64_request)
}

pub fn encode_response<R: Serialize>(response: R) -> Result<String, Error> {
    let json_response = serde_json::to_string(&response).map_err(Error::SerializeResponse)?;
    let base64_response = BASE64_STANDARD.encode(json_response);
    Ok(base64_response)
}

pub fn decode_request<R: for<'a> Deserialize<'a>>(base64_request: &str) -> Result<R, Error> {
    let json_request = String::from_utf8_lossy(&BASE64_STANDARD.decode(base64_request).map_err(Error::Base64DecodeRequest)?).to_string();
    let request = serde_json::from_str(&json_request).map_err(Error::DeserializeRequest)?;
    Ok(request)
}

pub fn decode_response<R: for<'a> Deserialize<'a>>(base64_response: &str) -> Result<R, Error> {
    let json_response = String::from_utf8_lossy(&BASE64_STANDARD.decode(base64_response).map_err(Error::Base64DecodeResponse)?).to_string();
    let response = serde_json::from_str(&json_response).map_err(Error::DeserializeResponse)?;
    Ok(response)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
    struct Request {
        name: String,
    }

    #[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
    struct Response {
        message: String,
    }

    #[test]
    fn serde_request_test() {
        let request = Request {
            name: "Bob".to_string(),
        };

        let encoded_request = encode_request(request.clone()).unwrap();
        let decoded_request: Request = decode_request(&encoded_request).unwrap();

        assert_eq!(request, decoded_request);
    }

    #[test]
    fn serde_response_test() {
        let response = Response {
            message: "Hello, Bob!".to_string(),
        };

        let encoded_response = encode_response(response.clone()).unwrap();
        let decoded_response: Response = decode_response(&encoded_response).unwrap();

        assert_eq!(response, decoded_response);
    }
}