Skip to main content

runx_contracts/
verification.rs

1//! Verification contracts: checks and statuses for governed verification.
2use serde::{Deserialize, Serialize};
3
4use crate::Reference;
5use crate::schema::{IsoDateTime, NonEmptyString, RunxSchema};
6
7pub const VERIFICATION_SCHEMA: &str = "runx.verification.v1";
8
9#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, RunxSchema)]
10pub enum VerificationSchema {
11    #[serde(rename = "runx.verification.v1")]
12    V1,
13}
14
15#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, RunxSchema)]
16#[serde(rename_all = "snake_case")]
17pub enum VerificationStatus {
18    Passed,
19    Failed,
20    Pending,
21    NotApplicable,
22    Missing,
23}
24
25#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, RunxSchema)]
26#[serde(deny_unknown_fields)]
27pub struct VerificationCheck {
28    pub check_id: NonEmptyString,
29    pub criterion_ids: Vec<NonEmptyString>,
30    pub status: VerificationStatus,
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub summary: Option<NonEmptyString>,
33    #[serde(default)]
34    pub checked_refs: Vec<Reference>,
35    // Required on the wire (present, possibly empty); no serde default so Rust
36    // deserialization matches the committed schema's `required` list.
37    pub evidence_refs: Vec<Reference>,
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub verified_at: Option<IsoDateTime>,
40}
41
42#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, RunxSchema)]
43#[serde(deny_unknown_fields)]
44#[runx_schema(id = "runx.verification.v1")]
45pub struct Verification {
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub schema: Option<VerificationSchema>,
48    #[serde(skip_serializing_if = "Option::is_none")]
49    pub verification_id: Option<NonEmptyString>,
50    pub status: VerificationStatus,
51    // Required on the wire (present, possibly empty); see `evidence_refs`.
52    pub checks: Vec<VerificationCheck>,
53    #[serde(skip_serializing_if = "Option::is_none")]
54    pub verified_at: Option<IsoDateTime>,
55    // Required on the wire (present, possibly empty); no serde default so Rust
56    // deserialization matches the committed schema's `required` list.
57    pub evidence_refs: Vec<Reference>,
58}
59
60#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, RunxSchema)]
61#[serde(deny_unknown_fields)]
62pub struct ReceiptVerificationSummary {
63    pub signature_valid: bool,
64    pub content_address_valid: bool,
65    pub hash_commitments_valid: bool,
66    pub authority_attenuation_valid: bool,
67    pub criteria_bound: bool,
68    pub redaction_valid: bool,
69    pub external_attestations_present: bool,
70}