use crate::error::EmbedError;
const ERR_BODY_CAP: usize = 4096;
pub(crate) fn classify_ureq_error(e: ureq::Error) -> EmbedError {
match e {
ureq::Error::Status(status, resp) => {
let body = resp
.into_string()
.unwrap_or_else(|ioe| format!("<response body read error: {ioe}>"));
let body = if body.len() > ERR_BODY_CAP {
body.chars().take(ERR_BODY_CAP).collect()
} else {
body
};
match status {
401 | 403 => EmbedError::Auth(body),
429 => EmbedError::RateLimited(body),
400..=499 => EmbedError::BadRequest { status, body },
500..=599 => EmbedError::Server { status, body },
_ => EmbedError::Server { status, body },
}
}
ureq::Error::Transport(t) => EmbedError::Network(t.to_string()),
}
}
pub(crate) fn decode_json<T: serde::de::DeserializeOwned>(
resp: ureq::Response,
) -> Result<T, EmbedError> {
resp.into_json::<T>()
.map_err(|e| EmbedError::Decode(e.to_string()))
}