use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[cfg(feature = "openapi")]
use utoipa::ToSchema;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct Timestamps {
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deleted_at: Option<DateTime<Utc>>,
}
impl Timestamps {
pub fn new(created_at: DateTime<Utc>, updated_at: DateTime<Utc>, deleted_at: Option<DateTime<Utc>>) -> Self {
Self {
created_at,
updated_at,
deleted_at,
}
}
pub fn builder() -> TimestampsBuilder {
<TimestampsBuilder as Default>::default()
}
}
#[derive(Debug, Clone, Default)]
pub struct TimestampsBuilder {
created_at: Option<DateTime<Utc>>,
updated_at: Option<DateTime<Utc>>,
deleted_at: Option<DateTime<Utc>>,
}
impl TimestampsBuilder {
pub fn created_at(mut self, value: DateTime<Utc>) -> Self {
self.created_at = Some(value);
self
}
pub fn updated_at(mut self, value: DateTime<Utc>) -> Self {
self.updated_at = Some(value);
self
}
pub fn deleted_at(mut self, value: DateTime<Utc>) -> Self {
self.deleted_at = Some(value);
self
}
pub fn build(self) -> Result<Timestamps, String> {
let updated_at = self.updated_at.ok_or_else(|| "updated_at is required".to_string())?;
let value = Timestamps {
created_at: self.created_at.unwrap_or(chrono::Utc::now()),
updated_at,
deleted_at: self.deleted_at,
};
Ok(value)
}
}