made-core 0.7.1

Domain core of MADE: entities, value objects, events, ports. No IO.
Documentation
use super::{
    BudgetOperationId, BudgetQuantities, BudgetReconciliationId, BudgetReservationEstimate,
    BudgetReservationId, MeasuredBudgetQuantities,
};
use serde::{Deserialize, Serialize};
use time::OffsetDateTime;

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct BudgetReservation {
    id: BudgetReservationId,
    operation_id: BudgetOperationId,
    quantities: BudgetQuantities,
    estimate: BudgetReservationEstimate,
    #[serde(with = "time::serde::rfc3339")]
    reserved_at: OffsetDateTime,
    reconciliation: Option<(BudgetReconciliationId, MeasuredBudgetQuantities)>,
}
impl BudgetReservation {
    #[must_use]
    pub const fn new(
        id: BudgetReservationId,
        operation_id: BudgetOperationId,
        quantities: BudgetQuantities,
        estimate: BudgetReservationEstimate,
        reserved_at: OffsetDateTime,
    ) -> Self {
        Self {
            id,
            operation_id,
            quantities,
            estimate,
            reserved_at,
            reconciliation: None,
        }
    }
    #[must_use]
    pub fn id(&self) -> &BudgetReservationId {
        &self.id
    }
    #[must_use]
    pub fn operation_id(&self) -> &BudgetOperationId {
        &self.operation_id
    }
    #[must_use]
    pub const fn quantities(&self) -> BudgetQuantities {
        self.quantities
    }
    #[must_use]
    pub const fn estimate(&self) -> BudgetReservationEstimate {
        self.estimate
    }
    #[must_use]
    pub const fn reserved_at(&self) -> OffsetDateTime {
        self.reserved_at
    }
    #[must_use]
    pub const fn reconciliation(
        &self,
    ) -> Option<&(BudgetReconciliationId, MeasuredBudgetQuantities)> {
        self.reconciliation.as_ref()
    }
    pub(crate) fn reconcile(
        &mut self,
        id: BudgetReconciliationId,
        measured: MeasuredBudgetQuantities,
    ) {
        self.reconciliation = Some((id, measured));
    }
}