use std::fmt::Display;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum ValidationError {
InvalidPasswordFormat(String),
InvalidAliasFormat(String),
InvalidUrlFormat(String),
InvalidMaxClicks(u32),
InvalidEmojiSequence(String),
}
impl Display for ValidationError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ValidationError::InvalidPasswordFormat(msg) => {
write!(f, "Invalid password format: {}", msg)
}
ValidationError::InvalidAliasFormat(msg) => write!(f, "Invalid alias format: {}", msg),
ValidationError::InvalidUrlFormat(msg) => write!(f, "Invalid URL format: {}", msg),
ValidationError::InvalidMaxClicks(value) => {
write!(f, "Max-clicks must be a positive integer, got: {}", value)
}
ValidationError::InvalidEmojiSequence(seq) => {
write!(f, "Invalid emoji sequence: {}", seq)
}
}
}
}
#[derive(Debug, Error)]
pub enum ApiError {
UrlError,
AliasError,
PasswordError,
MaxClicksError,
EmojiError,
RateLimitExceeded,
Other(String),
}
impl Display for ApiError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ApiError::UrlError => write!(f, "Invalid URL format"),
ApiError::AliasError => write!(f, "Alias already in use or invalid"),
ApiError::PasswordError => write!(f, "Incorrect password provided"),
ApiError::MaxClicksError => write!(f, "Invalid max clicks value"),
ApiError::EmojiError => write!(f, "Invalid or already used emoji sequence"),
ApiError::RateLimitExceeded => write!(f, "Rate limit exceeded for the API"),
ApiError::Other(msg) => write!(f, "API error: {}", msg),
}
}
}
#[derive(Debug, Error)]
pub enum UrlShortenerError {
Validation(ValidationError),
Api(ApiError),
Http(reqwest::Error),
Json(serde_json::Error),
Other(String),
}
impl Display for UrlShortenerError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
UrlShortenerError::Validation(err) => write!(f, "Validation error: {}", err),
UrlShortenerError::Api(err) => write!(f, "API error: {:?}", err),
UrlShortenerError::Http(err) => write!(f, "HTTP error: {}", err),
UrlShortenerError::Json(err) => write!(f, "JSON error: {}", err),
UrlShortenerError::Other(msg) => write!(f, "Other error: {}", msg),
}
}
}