use crate::CCashUsernameError;
use reqwest::Response;
use thiserror::Error;
#[derive(Debug)]
pub enum CCashResponse {
Success {
code: u16,
message: String,
},
Error {
code: u16,
message: String,
},
}
impl std::fmt::Display for CCashResponse {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{self:?}")
}
}
impl CCashResponse {
pub(crate) async fn from_response(response: Response) -> CCashResponse {
if response.status().is_success() {
Self::Success {
code: response.status().as_u16(),
message: response.text().await.unwrap_or_default(),
}
} else {
Self::Error {
code: response.status().as_u16(),
message: response.text().await.unwrap_or_default(),
}
}
}
pub(crate) fn convert_message<'de, T: serde::Deserialize<'de> + Default>(
&'de self,
) -> std::result::Result<T, ()> {
if let Self::Success { message, .. } = self {
serde_json::from_str::<Option<T>>(message)
.unwrap_or_default()
.map_or_else(|| Ok(Default::default()), Ok)
} else {
Err(())
}
}
}
#[derive(Error, Debug)]
pub enum CCashError {
#[error("An error occurred with a username: {0}")]
UsernameError(#[from] CCashUsernameError),
#[error("reqwest encontered an error: {0}")]
ReqwestError(#[from] reqwest::Error),
#[error(
"Client connection has not been established. Make sure establish_connection has \
been called and has returned a positive response."
)]
ConnectionNotAvailable,
#[error(
"Bank server returned value that could not be parsed correctly. Contact the \
server admin."
)]
CouldNotParsePropertiesResponse,
#[error("The `CCash` server responded with {0}")]
ErrorResponse(CCashResponse),
#[error("ccash-rs ran into a problem: {0}")]
Error(String),
}
impl From<CCashResponse> for CCashError {
fn from(r: CCashResponse) -> Self { CCashError::ErrorResponse(r) }
}
pub type Result<T> = std::result::Result<T, CCashError>;