prikk-store 0.24.0

Prikk storage crate scaffold.
Documentation
use prikk_object::NodeId;

use super::types::{
    MergeEvidenceItem, MergeEvidenceOutcome, MergeEvidenceProofPhase, MergeEvidenceReasonCode,
    MergeEvidenceSide,
};
use crate::patch_algebra::evidence_types::{EvidenceError, EvidenceFact, EvidenceScope};

pub(super) fn evidence_error_report(
    error: &EvidenceError,
) -> (MergeEvidenceOutcome, Vec<MergeEvidenceItem>) {
    let scope = evidence_error_scope(error);
    let outcome = match scope {
        EvidenceScope::SealedBaselineRequired | EvidenceScope::SealedCandidateRequired => {
            MergeEvidenceOutcome::EvidenceFailure
        }
        EvidenceScope::UnsealedCandidateOptional => MergeEvidenceOutcome::InvalidCandidate,
    };
    (
        outcome,
        vec![MergeEvidenceItem {
            side: MergeEvidenceSide::Report,
            operation_index: None,
            peer_operation_index: None,
            op_seq: None,
            peer_op_seq: None,
            operation_kind: None,
            node_id: evidence_error_node_id(error),
            path: None,
            outcome,
            evidence_scope: Some(scope.into()),
            proof_phase: MergeEvidenceProofPhase::Classification,
            reason_code: evidence_error_reason_code(error, outcome),
        }],
    )
}

fn evidence_error_scope(error: &EvidenceError) -> EvidenceScope {
    match error {
        EvidenceError::Missing { scope, .. }
        | EvidenceError::WrongObjectType { scope, .. }
        | EvidenceError::WrongBlobKind { scope, .. }
        | EvidenceError::Malformed { scope, .. }
        | EvidenceError::Unreadable { scope, .. } => *scope,
    }
}

fn evidence_error_node_id(error: &EvidenceError) -> Option<NodeId> {
    match error {
        EvidenceError::Missing { node_id, .. } => *node_id,
        EvidenceError::WrongObjectType { .. }
        | EvidenceError::WrongBlobKind { .. }
        | EvidenceError::Malformed { .. }
        | EvidenceError::Unreadable { .. } => None,
    }
}

fn evidence_error_reason_code(
    error: &EvidenceError,
    outcome: MergeEvidenceOutcome,
) -> MergeEvidenceReasonCode {
    if outcome == MergeEvidenceOutcome::InvalidCandidate {
        return match error {
            EvidenceError::Missing { fact, .. } if *fact != EvidenceFact::Operation => {
                MergeEvidenceReasonCode::InsufficientUnsealedCandidateEvidence
            }
            _ => MergeEvidenceReasonCode::InvalidUnsealedCandidate,
        };
    }
    match error {
        EvidenceError::Missing { .. } => MergeEvidenceReasonCode::MissingRequiredEvidence,
        EvidenceError::WrongObjectType { .. } | EvidenceError::WrongBlobKind { .. } => {
            MergeEvidenceReasonCode::WrongTypeRequiredEvidence
        }
        EvidenceError::Malformed { .. } => MergeEvidenceReasonCode::MalformedRequiredEvidence,
        EvidenceError::Unreadable { .. } => MergeEvidenceReasonCode::UnreadableRequiredEvidence,
    }
}