#[derive(Debug)]
pub struct ApiResponse<T> {
pub data: T,
pub request_id: Option<String>,
pub rate_limit_remaining: Option<u32>,
pub rate_limit_reset: Option<u64>,
pub cycles_tenant: Option<String>,
}
impl<T> ApiResponse<T> {
pub fn into_inner(self) -> T {
self.data
}
pub(crate) fn from_response(data: T, headers: &reqwest::header::HeaderMap) -> Self {
let header_str = |name: &str| -> Option<String> {
headers
.get(name)
.and_then(|v| v.to_str().ok())
.map(String::from)
};
let header_u32 = |name: &str| -> Option<u32> {
headers
.get(name)
.and_then(|v| v.to_str().ok())
.and_then(|v| v.parse().ok())
};
let header_u64 = |name: &str| -> Option<u64> {
headers
.get(name)
.and_then(|v| v.to_str().ok())
.and_then(|v| v.parse().ok())
};
Self {
data,
request_id: header_str("x-request-id"),
rate_limit_remaining: header_u32("x-ratelimit-remaining"),
rate_limit_reset: header_u64("x-ratelimit-reset"),
cycles_tenant: header_str("x-cycles-tenant"),
}
}
}
impl<T> std::ops::Deref for ApiResponse<T> {
type Target = T;
fn deref(&self) -> &T {
&self.data
}
}