made-core 0.7.1

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

use super::AuthorizationAction;
use crate::DomainError;

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct SeparationRule {
    approval_action: AuthorizationAction,
    execution_action: AuthorizationAction,
}

impl SeparationRule {
    pub fn new(
        approval_action: AuthorizationAction,
        execution_action: AuthorizationAction,
    ) -> Result<Self, DomainError> {
        if approval_action == execution_action {
            return Err(DomainError::InvariantViolated {
                reason: "authorization separation actions must differ",
            });
        }
        Ok(Self {
            approval_action,
            execution_action,
        })
    }

    #[must_use]
    pub const fn approval_action(self) -> AuthorizationAction {
        self.approval_action
    }

    #[must_use]
    pub const fn execution_action(self) -> AuthorizationAction {
        self.execution_action
    }
}