use crate::errors::ClientError;
use async_trait::async_trait;
use http::{Request, Response};
use std::ops::RangeInclusive;
pub const HTTP_SUCCESS_CODES: RangeInclusive<u16> = 200..=208;
#[async_trait]
pub trait Client: Sync + Send {
async fn send(&self, req: Request<Vec<u8>>) -> Result<Response<Vec<u8>>, ClientError>;
fn base(&self) -> &str;
#[allow(clippy::blocks_in_conditions)]
#[instrument(skip(self, req), fields(uri=%req.uri(), method=%req.method()), err)]
async fn execute(&self, req: Request<Vec<u8>>) -> Result<Response<Vec<u8>>, ClientError> {
debug!(
name: "sending_request",
body_len=req.body().len(),
"Sending Request",
);
let response = self.send(req).await?;
let status = response.status();
debug!(
name: "response_received",
status=status.as_u16(),
response_len=response.body().len(),
is_error=status.is_client_error() || status.is_server_error(),
"Response Received",
);
if !HTTP_SUCCESS_CODES.contains(&response.status().as_u16()) {
return Err(ClientError::ServerResponseError {
code: response.status().as_u16(),
content: String::from_utf8(response.body().to_vec()).ok(),
});
}
Ok(response)
}
}