agent-migrate-core 0.6.1

Core models and transactional filesystem engine for agent configuration migration
Documentation
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "state", rename_all = "snake_case")]
pub enum Compatibility {
    Exact,
    Converted,
    Bridged { requirement: String },
    Lossy { reason: String },
    PreservedUnavailable { reason: String },
    Blocked { reason: String },
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ImportDecision {
    Allowed,
    NeedsLossyAcceptance,
    BridgeUnavailable,
    Blocked,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ImportPolicy {
    accept_lossy: bool,
}

impl ImportPolicy {
    #[must_use]
    pub const fn strict() -> Self {
        Self {
            accept_lossy: false,
        }
    }

    #[must_use]
    pub const fn accept_lossy() -> Self {
        Self { accept_lossy: true }
    }

    #[must_use]
    pub fn decide(self, compatibility: &Compatibility, bridge_healthy: bool) -> ImportDecision {
        match compatibility {
            Compatibility::Exact | Compatibility::Converted => ImportDecision::Allowed,
            Compatibility::Bridged { .. } if bridge_healthy => ImportDecision::Allowed,
            Compatibility::Bridged { .. } => ImportDecision::BridgeUnavailable,
            Compatibility::Lossy { .. } | Compatibility::PreservedUnavailable { .. }
                if self.accept_lossy =>
            {
                ImportDecision::Allowed
            }
            Compatibility::Lossy { .. } | Compatibility::PreservedUnavailable { .. } => {
                ImportDecision::NeedsLossyAcceptance
            }
            Compatibility::Blocked { .. } => ImportDecision::Blocked,
        }
    }
}