use std::error::Error;
use std::fmt::Display;
use std::fmt::Formatter;
use std::fmt::Result as FmtResult;
use serde::Deserialize;
#[derive(Clone, Debug, Deserialize, PartialEq)]
pub struct ErrorMessage {
#[serde(rename = "message")]
pub message: String,
}
impl Display for ErrorMessage {
fn fmt(&self, fmt: &mut Formatter<'_>) -> FmtResult {
write!(fmt, "{}", self.message)
}
}
impl Error for ErrorMessage {}
macro_rules! Endpoint {
( $(#[$docs:meta])* $pub:vis $name:ident($in:ty),
Ok => $out:ty, [$($(#[$ok_docs:meta])* $ok_status:ident,)*],
Err => $err:ident, [$($(#[$err_docs:meta])* $err_status:ident => $variant:ident,)*]
$($defs:tt)* ) => {
EndpointDef! {
$(#[$docs])* $pub $name($in),
Ok => $out, [$($ok_status,)*],
Err => $err, [
UNAUTHORIZED => AuthenticationFailed,
TOO_MANY_REQUESTS => RateLimitExceeded,
$($(#[$err_docs])* $err_status => $variant,)*
],
ConversionErr => ::serde_json::Error,
ApiErr => crate::endpoint::ErrorMessage,
fn parse(body: &[u8]) -> Result<Self::Output, Self::ConversionError> {
::serde_json::from_slice::<Self::Output>(body)
}
fn parse_err(body: &[u8]) -> Result<Self::ApiError, Vec<u8>> {
::serde_json::from_slice::<Self::ApiError>(body).map_err(|_| body.to_vec())
}
$($defs)*
}
};
}