use super::Error;
use serde::de::{DeserializeOwned, IntoDeserializer};
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use serde_json::Value;
pub async fn parse_json_response<T: 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)
}
}
}
pub fn de_non_empty_object<'de, D, T>(deserializer: D) -> Result<Option<T>, D::Error>
where
D: Deserializer<'de>,
T: DeserializeOwned,
{
let value = Value::deserialize(deserializer)?;
match value {
Value::Object(map) if map.is_empty() => Ok(None),
Value::Object(_) => T::deserialize(value)
.map(Some)
.map_err(serde::de::Error::custom),
_ => Err(serde::de::Error::custom(
"expected JSON object for this field",
)),
}
}
pub fn se_as_json_string<T, S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
where
T: Serialize,
S: Serializer,
{
let json_str = serde_json::to_string(value).map_err(serde::ser::Error::custom)?;
serializer.serialize_str(&json_str)
}