use lambda_http::ext::PayloadError;
use serde::Serialize;
use serde_with::{serde_as, DisplayFromStr};
use thiserror::Error;
#[serde_as]
#[derive(Debug, Error, Serialize)]
pub enum Error {
#[error("{0}")]
SerializeJSON(
#[from]
#[serde_as(as = "DisplayFromStr")]
serde_json::Error,
),
#[error("{0}")]
DeserializeURLEncoded(
#[from]
#[serde_as(as = "DisplayFromStr")]
serde_urlencoded::de::Error,
),
#[error("{0}")]
Payload(#[serde_as(as = "DisplayFromStr")] PayloadError),
#[error("not found")]
NotFound,
#[error("method not allowed")]
MethodNotAllowed,
#[error("no payload")]
NoPayload,
}
impl Error {
pub fn is_not_found(&self) -> bool {
matches!(self, Self::NotFound)
}
pub fn status_code(&self) -> u16 {
match self {
Self::NotFound => 404,
Self::MethodNotAllowed => 405,
_ => 400,
}
}
pub fn json(&self) -> Result<String, Self> {
let err: Result<(), &Self> = Err(self);
Ok(serde_json::to_string(&err)?)
}
}