Skip to main content

made_core/entities/
budget_ledger_event.rs

1use serde::{Deserialize, Serialize};
2use time::OffsetDateTime;
3
4use crate::value_objects::{
5    BudgetAccountId, BudgetLimits, BudgetOperationId, BudgetQuantities, BudgetReconciliationId,
6    BudgetReservationEstimate, BudgetReservationId, MeasuredBudgetQuantities,
7};
8
9#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
10#[serde(rename_all = "snake_case", tag = "type")]
11pub enum BudgetLedgerEvent {
12    Opened {
13        account_id: BudgetAccountId,
14        limits: BudgetLimits,
15        #[serde(with = "time::serde::rfc3339")]
16        opened_at: OffsetDateTime,
17    },
18    Reserved {
19        account_id: BudgetAccountId,
20        reservation_id: BudgetReservationId,
21        operation_id: BudgetOperationId,
22        quantities: BudgetQuantities,
23        estimate: BudgetReservationEstimate,
24        #[serde(with = "time::serde::rfc3339")]
25        reserved_at: OffsetDateTime,
26    },
27    Reconciled {
28        account_id: BudgetAccountId,
29        reservation_id: BudgetReservationId,
30        reconciliation_id: BudgetReconciliationId,
31        measured: MeasuredBudgetQuantities,
32        #[serde(with = "time::serde::rfc3339")]
33        reconciled_at: OffsetDateTime,
34    },
35}
36
37impl BudgetLedgerEvent {
38    #[must_use]
39    pub const fn account_id(&self) -> &BudgetAccountId {
40        match self {
41            Self::Opened { account_id, .. }
42            | Self::Reserved { account_id, .. }
43            | Self::Reconciled { account_id, .. } => account_id,
44        }
45    }
46}