use crate::belief::Belief;
use crate::claim::{Cardinality, Confidence, Criticality};
use crate::identity::SubjectLineRef;
use crate::provenance::ProvenanceLabel;
use crate::time::ValidTime;
use crate::claim::Fact;
use crate::claim::Claim;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct ClaimProposal {
pub fact: Fact,
pub suggested_valid_time: Option<ValidTime>,
pub suggested_cardinality: Cardinality,
pub confidence: Confidence,
pub suggested_provenance: Option<ProvenanceLabel>,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct AdjudicationRequest {
pub subject_line: SubjectLineRef,
pub incumbent: Belief,
pub challenger: Claim,
pub criticality: Criticality,
pub reason: OverturnReason,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[non_exhaustive]
pub enum OverturnReason {
ExternalContradiction,
ValidityBound,
DependsOnSuperseded,
HighDerivationDepth,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct AdjudicationResponse {
pub handle_id: uuid::Uuid,
pub verdict: AdjudicationVerdict,
pub evidence_provenance: ProvenanceLabel,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[non_exhaustive]
pub enum AdjudicationVerdict {
Affirm,
Deny,
Unknown,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct AdjudicationOutcome {
pub handle_id: uuid::Uuid,
pub disposition: crate::disposition::Disposition,
pub claim_ref: crate::identity::ClaimRef,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::provenance::{ExternalKind, ProvenanceLabel};
#[test]
fn claim_proposal_carries_suggested_provenance() {
let p = ClaimProposal {
fact: Fact { subject: "s".into(), predicate: "p".into(), value: serde_json::json!(1) },
suggested_valid_time: None,
suggested_cardinality: Cardinality::Unknown,
confidence: Confidence { value_confidence: 0.8, valid_time_confidence: 0.0 },
suggested_provenance: Some(ProvenanceLabel::External(ExternalKind::UserAsserted)),
};
assert!(p.suggested_provenance.is_some());
}
#[test]
fn overture_reason_round_trip_serde() {
let reasons = [
OverturnReason::ExternalContradiction,
OverturnReason::ValidityBound,
OverturnReason::DependsOnSuperseded,
OverturnReason::HighDerivationDepth,
];
for r in &reasons {
let json = serde_json::to_string(r).unwrap();
let back: OverturnReason = serde_json::from_str(&json).unwrap();
assert_eq!(r, &back);
}
}
#[test]
fn adjudication_verdict_round_trip_serde() {
let verdicts = [
AdjudicationVerdict::Affirm,
AdjudicationVerdict::Deny,
AdjudicationVerdict::Unknown,
];
for v in &verdicts {
let json = serde_json::to_string(v).unwrap();
let back: AdjudicationVerdict = serde_json::from_str(&json).unwrap();
assert_eq!(v, &back);
}
}
#[test]
fn adjudication_outcome_round_trip_serde() {
use crate::disposition::Disposition;
use crate::identity::ClaimRef;
let outcome = AdjudicationOutcome {
handle_id: uuid::Uuid::parse_str("550e8400-e29b-41d4-a716-446655440000").unwrap(),
disposition: Disposition::Superseded,
claim_ref: ClaimRef::new_random(),
};
let json = serde_json::to_string(&outcome).unwrap();
let back: AdjudicationOutcome = serde_json::from_str(&json).unwrap();
assert_eq!(back.handle_id, outcome.handle_id);
assert_eq!(back.disposition, outcome.disposition);
assert_eq!(back.claim_ref, outcome.claim_ref);
}
#[test]
fn adjudication_response_has_oracle_present_field_via_handle_id() {
let resp = AdjudicationResponse {
handle_id: uuid::Uuid::new_v4(),
verdict: AdjudicationVerdict::Affirm,
evidence_provenance: ProvenanceLabel::External(ExternalKind::ExternalFirstHand),
};
assert_eq!(resp.verdict, AdjudicationVerdict::Affirm);
}
}