use serde::{Deserialize, Serialize};
use crate::identity::IdentityId;
use crate::receipt::witness::WitnessSignature;
use crate::spawn::SpawnId;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum ImpossibilityReason {
NotInCeiling,
NotInLineage,
SpawnExclusion { spawn_id: SpawnId },
CapabilityNonexistent,
VoluntaryDeclaration { declaration_id: DeclarationId },
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct NegativeProofId(pub String);
impl std::fmt::Display for NegativeProofId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NegativeCapabilityProof {
pub proof_id: NegativeProofId,
pub identity: IdentityId,
pub cannot_do: String, pub reason: ImpossibilityReason,
pub evidence: NegativeEvidence,
pub generated_at: u64,
pub valid_until: Option<u64>,
pub proof_hash: String,
pub signature: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum NegativeEvidence {
CeilingExclusion {
ceiling: Vec<String>,
ceiling_hash: String,
},
LineageExclusion {
lineage: Vec<IdentityId>,
ancestor_ceilings: Vec<(IdentityId, Vec<String>)>,
lineage_hash: String,
},
SpawnExclusion {
spawn_id: SpawnId,
spawn_record_hash: String,
exclusions: Vec<String>,
},
Declaration { declaration_id: DeclarationId },
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct DeclarationId(pub String);
impl std::fmt::Display for DeclarationId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NegativeDeclaration {
pub declaration_id: DeclarationId,
pub identity: IdentityId,
pub cannot_do: Vec<String>, pub reason: String,
pub declared_at: u64,
pub permanent: bool,
pub witnesses: Vec<WitnessSignature>,
pub signature: String,
}
#[derive(Debug, Clone)]
pub struct NegativeVerification {
pub proof_id: NegativeProofId,
pub identity: IdentityId,
pub capability: String,
pub reason_valid: bool,
pub evidence_valid: bool,
pub signature_valid: bool,
pub is_valid: bool,
pub verified_at: u64,
pub errors: Vec<String>,
}