use std::fmt::Display;
use anyhow::Result;
use hyper::StatusCode;
use serde::Serialize;
pub use upstream::{UpstreamRequest, UpstreamResponse};
use crate::Error;
mod upstream;
#[derive(Debug, Clone, Serialize)]
pub struct Response {
pub(crate) request: UpstreamRequest,
pub(crate) response: UpstreamResponse,
}
impl Response {
pub fn from_json<T: serde::de::DeserializeOwned>(&self) -> Result<T> {
serde_json::from_slice(&self.response.body).map_err(|e| Error::Deserialization(e.to_string()).into())
}
pub const fn status(&self) -> StatusCode {
self.response.status
}
pub const fn headers(&self) -> &hyper::HeaderMap {
&self.response.headers
}
pub const fn version(&self) -> hyper::Version {
self.response.version
}
pub fn request_from_json<T: serde::de::DeserializeOwned>(&self) -> Result<T> {
serde_json::from_str(&self.request.body).map_err(|e| Error::Deserialization(e.to_string()).into())
}
pub fn request_to_string(&self) -> &str {
&self.request.body
}
pub const fn request_headers(&self) -> &hyper::HeaderMap {
&self.request.headers
}
pub const fn request_method(&self) -> &hyper::Method {
&self.request.method
}
pub const fn request_uri(&self) -> &hyper::Uri {
&self.request.uri
}
pub const fn request_version(&self) -> hyper::Version {
self.request.version
}
}
impl Display for Response {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let body = std::str::from_utf8(&self.response.body).unwrap_or_default();
write!(f, "{body}")
}
}