use std::ops::{Deref, DerefMut};
use bytes::Bytes;
use http::{HeaderMap, StatusCode};
use crate::providers::ProviderKind;
#[derive(Debug, Clone)]
pub struct ResponseMeta {
pub status: StatusCode,
pub headers: HeaderMap,
pub request_id: Option<String>,
pub provider: ProviderKind,
pub attempts: usize,
pub url: String,
}
#[derive(Debug, Clone)]
pub struct ApiResponse<T> {
pub data: T,
pub meta: ResponseMeta,
}
impl<T> ApiResponse<T> {
pub fn new(data: T, meta: ResponseMeta) -> Self {
Self { data, meta }
}
pub fn into_parts(self) -> (T, ResponseMeta) {
(self.data, self.meta)
}
}
impl<T> Deref for ApiResponse<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.data
}
}
impl<T> DerefMut for ApiResponse<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.data
}
}
pub fn into_http_response(meta: &ResponseMeta, body: Bytes) -> http::Response<Bytes> {
let mut response = http::Response::builder().status(meta.status);
if let Some(headers) = response.headers_mut() {
headers.extend(meta.headers.clone());
}
response
.body(body)
.unwrap_or_else(|_| http::Response::new(Bytes::new()))
}