Skip to main content

backbone_bucket/domain/value_objects/
timestamps.rs

1//! Timestamps value object
2//!
3//! Generated by metaphor-schema. Do not edit manually.
4//!
5//! This is a DDD Value Object - immutable, no identity, equality by attributes.
6
7use chrono::{DateTime, Utc};
8use serde::{Deserialize, Serialize};
9#[cfg(feature = "openapi")]
10use utoipa::ToSchema;
11
12#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
13#[cfg_attr(feature = "openapi", derive(ToSchema))]
14pub struct Timestamps {
15    pub created_at: DateTime<Utc>,
16    pub updated_at: DateTime<Utc>,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub deleted_at: Option<DateTime<Utc>>,
19}
20
21impl Timestamps {
22    /// Create a new Timestamps value object
23    pub fn new(created_at: DateTime<Utc>, updated_at: DateTime<Utc>, deleted_at: Option<DateTime<Utc>>) -> Self {
24        Self {
25            created_at,
26            updated_at,
27            deleted_at,
28        }
29    }
30
31    /// Create a builder for Timestamps
32    pub fn builder() -> TimestampsBuilder {
33        <TimestampsBuilder as Default>::default()
34    }
35
36}
37
38/// Builder for Timestamps value object
39#[derive(Debug, Clone, Default)]
40pub struct TimestampsBuilder {
41    created_at: Option<DateTime<Utc>>,
42    updated_at: Option<DateTime<Utc>>,
43    deleted_at: Option<DateTime<Utc>>,
44}
45
46impl TimestampsBuilder {
47    /// Set the created_at field
48    pub fn created_at(mut self, value: DateTime<Utc>) -> Self {
49        self.created_at = Some(value);
50        self
51    }
52
53    /// Set the updated_at field
54    pub fn updated_at(mut self, value: DateTime<Utc>) -> Self {
55        self.updated_at = Some(value);
56        self
57    }
58
59    /// Set the deleted_at field
60    pub fn deleted_at(mut self, value: DateTime<Utc>) -> Self {
61        self.deleted_at = Some(value);
62        self
63    }
64
65    /// Build the Timestamps value object
66    pub fn build(self) -> Result<Timestamps, String> {
67        let updated_at = self.updated_at.ok_or_else(|| "updated_at is required".to_string())?;
68
69        let value = Timestamps {
70            created_at: self.created_at.unwrap_or(chrono::Utc::now()),
71            updated_at,
72            deleted_at: self.deleted_at,
73        };
74
75        Ok(value)
76    }
77
78}