use self::rest::RestRequest;
use crate::error::SocketError;
use reqwest::StatusCode;
use serde::de::DeserializeOwned;
use tracing::error;
pub mod rest;
pub mod private;
pub mod public;
pub trait BuildStrategy {
fn build<Request>(
&self,
request: Request,
builder: reqwest::RequestBuilder,
) -> Result<reqwest::Request, SocketError>
where
Request: RestRequest;
}
pub trait HttpParser {
type ApiError: DeserializeOwned;
type OutputError: From<SocketError>;
fn parse<Response>(
&self,
status: StatusCode,
payload: &[u8],
) -> Result<Response, Self::OutputError>
where
Response: DeserializeOwned,
{
let parse_ok_error = match serde_json::from_slice::<Response>(payload) {
Ok(response) => return Ok(response),
Err(serde_error) => serde_error,
};
let parse_api_error_error = match serde_json::from_slice::<Self::ApiError>(payload) {
Ok(api_error) => return Err(self.parse_api_error(status, api_error)),
Err(serde_error) => serde_error,
};
error!(
status_code = ?status,
?parse_ok_error,
?parse_api_error_error,
response_body = %String::from_utf8_lossy(payload),
"error deserializing HTTP response"
);
Err(Self::OutputError::from(SocketError::DeserialiseBinary {
error: parse_ok_error,
payload: payload.to_vec(),
}))
}
fn parse_api_error(&self, status: StatusCode, error: Self::ApiError) -> Self::OutputError;
}