use bytes::Bytes;
use http::StatusCode;
use http_request_derive::FromHttpResponse;
use serde::de::DeserializeOwned;
#[derive(Debug, derive_more::From, derive_more::Into)]
pub struct DataOption<T>(pub Option<T>);
impl<D: DeserializeOwned> FromHttpResponse for DataOption<D> {
fn from_http_response(
http_response: http::Response<Bytes>,
) -> Result<Self, http_request_derive::Error>
where
Self: Sized,
{
if http_response.status() == StatusCode::NO_CONTENT {
return Ok(None.into());
};
let data = serde_json::from_slice(http_response.body()).map_err(|e| {
http_request_derive::Error::custom(format!("Couldn't deserialize JSON: {e:?}"))
})?;
Ok(Some(data).into())
}
}