made-core 0.8.0

Domain core of MADE: entities, value objects, events, ports. No IO.
Documentation
use serde::{Deserialize, Serialize};
use time::OffsetDateTime;

use crate::value_objects::{
    BudgetAccountId, BudgetLimits, BudgetOperationId, BudgetQuantities, BudgetReconciliationId,
    BudgetReservationEstimate, BudgetReservationId, MeasuredBudgetQuantities,
};

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case", tag = "type")]
pub enum BudgetLedgerEvent {
    Opened {
        account_id: BudgetAccountId,
        limits: BudgetLimits,
        #[serde(with = "time::serde::rfc3339")]
        opened_at: OffsetDateTime,
    },
    Reserved {
        account_id: BudgetAccountId,
        reservation_id: BudgetReservationId,
        operation_id: BudgetOperationId,
        quantities: BudgetQuantities,
        estimate: BudgetReservationEstimate,
        #[serde(with = "time::serde::rfc3339")]
        reserved_at: OffsetDateTime,
    },
    Reconciled {
        account_id: BudgetAccountId,
        reservation_id: BudgetReservationId,
        reconciliation_id: BudgetReconciliationId,
        measured: MeasuredBudgetQuantities,
        #[serde(with = "time::serde::rfc3339")]
        reconciled_at: OffsetDateTime,
    },
}

impl BudgetLedgerEvent {
    #[must_use]
    pub const fn account_id(&self) -> &BudgetAccountId {
        match self {
            Self::Opened { account_id, .. }
            | Self::Reserved { account_id, .. }
            | Self::Reconciled { account_id, .. } => account_id,
        }
    }
}