use serde::de::DeserializeOwned;
use crate::{Error, HeaderName, HeaderValue, imp};
use std::convert::TryInto;
pub struct Response(pub(crate) imp::Resp);
impl Response {
pub fn status_code(&self) -> u16 {
self.0.status()
}
pub fn status(&self) -> &str {
self.0.status_str()
}
pub async fn json<D: DeserializeOwned>(&mut self) -> Result<D, Error> {
self.0.json().await
}
pub async fn content(&mut self) -> Result<Vec<u8>, Error> {
self.0.bytes().await
}
pub async fn text(&mut self) -> Result<String, Error> {
self.0.string().await
}
pub fn header(
&self,
name: impl TryInto<HeaderName, Error = imp::Error>,
) -> Option<&HeaderValue> {
match name.try_into() {
Err(_) => None,
Ok(name) => self.0.get_header(name.into()).map(|v| v.into()),
}
}
pub fn headers(&self) -> impl Iterator<Item = (&HeaderName, &HeaderValue)> {
self.0.header_iter().map(|(n, v)| (n.into(), v.into()))
}
}
impl std::fmt::Debug for Response {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let h: Vec<(&HeaderName, &HeaderValue)> = self.headers().collect();
write!(f, "HTTP {} Header: {:?}", self.status_code(), h)
}
}