Documentation
use http_api_client::http::StatusCode;
use serde::{Deserialize, Serialize};
use serde_enum_str::{Deserialize_enum_str, Serialize_enum_str};

//
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct Error {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub field: Option<String>,
    pub reason: ErrorReason,
}

//
#[derive(Deserialize_enum_str, Serialize_enum_str, Debug, Clone, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum ErrorReason {
    #[serde(rename = "Invalid JSON")]
    InvalidJson,
    #[serde(rename = "Invalid Token")]
    InvalidToken,
    #[serde(rename = "Not found", alias = "Not Found")]
    NotFound,
    #[serde(other)]
    Other(String),
}
impl ErrorReason {
    pub fn http_status_code(&self) -> Option<StatusCode> {
        match self {
            ErrorReason::InvalidJson => Some(StatusCode::BAD_REQUEST),
            ErrorReason::InvalidToken => Some(StatusCode::NOT_FOUND),
            ErrorReason::NotFound => Some(StatusCode::UNAUTHORIZED),
            ErrorReason::Other(_) => None,
        }
    }
}