authority-delegation 0.1.0

Typed delegated-authority surface crate with bounded lease and policy artifacts; not an access-control runtime
Documentation
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct RoleDefinitionV1 {
    pub role: String,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub capabilities: Vec<String>,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct DelegationEdgeV1 {
    pub from_role: String,
    pub to_role: String,
    pub capability: String,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct ApprovalRuleV1 {
    pub action_class: String,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub required_roles: Vec<String>,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct RoleConflictClassRuleV1 {
    pub conflict_class: String,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub disallowed_roles: Vec<String>,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct RoleCatalogV1 {
    pub schema_version: String,
    pub role_catalog_id: String,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub role_definitions: Vec<RoleDefinitionV1>,
    pub default_autonomy_ceiling: String,
    pub scope_rule: String,
    pub review_cycle_days: i64,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct DelegationMatrixV1 {
    pub schema_version: String,
    pub delegation_matrix_id: String,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub allowed_edges: Vec<DelegationEdgeV1>,
    pub max_delegation_depth: i64,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub required_lease_classes: Vec<String>,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub forbidden_chain_patterns: Vec<String>,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct ApprovalMatrixV1 {
    pub schema_version: String,
    pub approval_matrix_id: String,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub approval_rules: Vec<ApprovalRuleV1>,
    pub default_quorum: String,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub requires_independent_review_for: Vec<String>,
    pub break_glass_post_hoc_review_hours: i64,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct ConflictClassCatalogV1 {
    pub schema_version: String,
    pub conflict_class_catalog_id: String,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub conflict_classes: Vec<RoleConflictClassRuleV1>,
    pub default_recusal_behavior: String,
    pub override_path: String,
    pub disclosure_required: bool,
}