#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum CompatDiagnostic {
MissingWitness,
MissingRoundTripFixture,
RawEvidenceExportedAsAdmitted,
LossyProjectionWithoutPolicy,
HiddenFlattening,
MissingRefusalPath,
MissingReceiptShape,
UnreachablePrimitive,
MigrationRecommended,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum DiagnosticSeverity {
Error,
Warning,
Info,
}
impl core::fmt::Display for DiagnosticSeverity {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
DiagnosticSeverity::Error => f.write_str("Error"),
DiagnosticSeverity::Warning => f.write_str("Warning"),
DiagnosticSeverity::Info => f.write_str("Info"),
}
}
}
impl core::fmt::Display for CompatDiagnostic {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
let (severity, message) = match self {
CompatDiagnostic::MissingWitness => (
DiagnosticSeverity::Error,
"missing witness: admitted/projected surface must name its authority",
),
CompatDiagnostic::MissingRoundTripFixture => (
DiagnosticSeverity::Error,
"missing round-trip fixture: round-trip claim requires an import→export→compare fixture",
),
CompatDiagnostic::RawEvidenceExportedAsAdmitted => (
DiagnosticSeverity::Error,
"raw evidence exported as admitted: route through Admit before export",
),
CompatDiagnostic::LossyProjectionWithoutPolicy => (
DiagnosticSeverity::Error,
"lossy projection without policy: use Project under an explicit LossPolicy",
),
CompatDiagnostic::HiddenFlattening => (
DiagnosticSeverity::Error,
"hidden flattening: emit a LossReport itemising discarded evidence",
),
CompatDiagnostic::MissingRefusalPath => (
DiagnosticSeverity::Error,
"missing refusal path: Admit/Project impl must carry a named Reason type",
),
CompatDiagnostic::MissingReceiptShape => (
DiagnosticSeverity::Error,
"missing receipt shape: provenance-bearing evidence must be wrapped in Receipted",
),
CompatDiagnostic::UnreachablePrimitive => (
DiagnosticSeverity::Error,
"unreachable primitive: connect or remove the orphaned canon type",
),
CompatDiagnostic::MigrationRecommended => (
DiagnosticSeverity::Info,
"migration recommended: surface has outgrown compat — graduate to wasm4pm",
),
};
write!(f, "[{severity}] {message}")
}
}