use super::Error;
use serde::de::IntoDeserializer;
use serde::{Deserialize, Deserializer};
pub async fn parse_json_response<T: serde::de::DeserializeOwned>(
resp: reqwest::Response,
) -> Result<T, Error> {
let status = resp.status();
if !status.is_success() {
return Err(Error::RequestAPIFailed {
code: status.to_string(),
message: resp.text().await?,
});
}
let data = resp.json().await?;
Ok(data)
}
pub fn de_option_empty_string_as_none<'de, D, T>(deserializer: D) -> Result<Option<T>, D::Error>
where
D: Deserializer<'de>,
T: Deserialize<'de>,
{
let opt = Option::<String>::deserialize(deserializer)?;
match opt {
None => Ok(None),
Some(s) if s.is_empty() => Ok(None),
Some(s) => {
T::deserialize(s.into_deserializer()).map(Some)
}
}
}