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,
}
}
}