use thiserror::Error;
use crate::model::status::BookingStatus;
#[derive(Debug, Error)]
pub enum BookingError {
#[error("Booking item with ID {0} is unavailable.")]
ItemUnavailable(String),
#[error("Booking status is invalid: {0}")]
InvalidStatus(String),
#[error("Invalid status transition from {from:?} to {to:?}")]
InvalidStatusTransition {
from: BookingStatus,
to: BookingStatus,
},
#[error("Failed to create booking: {0}")]
CreationFailed(String),
#[error("Booking rule validation failed: {0}")]
RuleValidationFailed(String),
#[error("Booking item quantity exceeds available limit.")]
QuantityExceeded,
#[error("General error: {0}")]
GeneralError(String),
}
impl BookingError {
pub fn new_invalid_status(status: &str) -> Self {
BookingError::InvalidStatus(status.to_string())
}
pub fn new_item_unavailable(item_id: &str) -> Self {
BookingError::ItemUnavailable(item_id.to_string())
}
pub fn new_invalid_transition(from: BookingStatus, to: BookingStatus) -> Self {
BookingError::InvalidStatusTransition { from, to }
}
pub fn new_creation_failed(message: &str) -> Self {
BookingError::CreationFailed(message.to_string())
}
pub fn new_rule_validation_failed(message: &str) -> Self {
BookingError::RuleValidationFailed(message.to_string())
}
pub fn new_quantity_exceeded() -> Self {
BookingError::QuantityExceeded
}
pub fn new_general_error(message: &str) -> Self {
BookingError::GeneralError(message.to_string())
}
}