proofmode 0.9.0

Capture, share, and preserve verifiable photos and videos
Documentation
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub enum Severity {
    Info,
    Warning,
    Error,
}

#[derive(Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub enum DiscrepancyKind {
    MissingData,
    Mismatch,
    Outlier,
    TemporalAnomaly,
    SpatialAnomaly,
}

#[derive(Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Discrepancy {
    pub field: String,
    pub severity: Severity,
    pub kind: DiscrepancyKind,
    pub message: String,
}

#[derive(Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct FileDiscrepancies {
    pub file_name: String,
    pub flags: Vec<Discrepancy>,
    pub flag_count: usize,
}

#[derive(Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct DeviceDiscrepancies {
    pub device_id: String,
    pub file_count: usize,
    pub flags: Vec<Discrepancy>,
}

#[derive(Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ConsistencySummary {
    pub total_files: usize,
    pub files_with_flags: usize,
    pub total_flags: usize,
}

#[derive(Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct TemporalPatterns {
    pub mean_interval_seconds: f64,
    pub std_interval_seconds: f64,
    pub min_interval_seconds: f64,
    pub max_interval_seconds: f64,
    pub burst_count: usize,
    pub gap_count: usize,
    pub anomalous_intervals: Vec<TemporalGap>,
}

#[derive(Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct TemporalGap {
    pub file_before: String,
    pub file_after: String,
    pub interval_seconds: f64,
    pub z_score: f64,
}