use serde::{Deserialize, Serialize};
use crate::model::status::BookingStatus;
use crate::traits::Bookable;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Booking<T, ID, Timestamp, Metadata> {
pub id: ID,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id: Option<ID>,
pub item: T,
pub status: BookingStatus,
pub created_at: Timestamp,
#[serde(skip_serializing_if = "Option::is_none")]
pub expires_at: Option<Timestamp>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
}
impl<T, ID, Timestamp, Metadata> Booking<T, ID, Timestamp, Metadata>
where
T: Bookable,
{
pub fn item_id(&self) -> &str {
self.item.id()
}
pub fn is_pending(&self) -> bool {
self.status == BookingStatus::Pending
}
pub fn is_confirmed(&self) -> bool {
self.status == BookingStatus::Confirmed
}
pub fn is_canceled(&self) -> bool {
self.status == BookingStatus::Canceled
}
pub fn is_expired(&self) -> bool {
self.status == BookingStatus::Expired
}
pub fn is_active(&self) -> bool {
matches!(self.status, BookingStatus::Pending | BookingStatus::Confirmed)
}
pub fn is_final(&self) -> bool {
matches!(
self.status,
BookingStatus::Canceled |
BookingStatus::Expired |
BookingStatus::Failed |
BookingStatus::Completed
)
}
pub fn is_completed(&self) -> bool {
self.status == BookingStatus::Completed
}
}