use serde::{Deserialize, Serialize};
use crate::CapabilityProfile;
#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[serde(rename_all = "snake_case")]
pub enum AnalysisTier {
Syntactic,
Semantic,
DataFlow,
}
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Default)]
pub struct AnalysisCompleteness {
pub analyzed_files: usize,
pub skipped_files: usize,
#[serde(default, skip_serializing_if = "<[Box<str>]>::is_empty")]
pub skipped_paths: Box<[Box<str>]>,
#[serde(default, skip_serializing_if = "<[SkippedAnalysis]>::is_empty")]
pub skipped_details: Box<[SkippedAnalysis]>,
}
impl AnalysisCompleteness {
pub fn is_complete(&self) -> bool {
self.skipped_files == 0
}
}
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
pub struct SkippedAnalysis {
pub path: Box<str>,
pub error: Box<str>,
}
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
pub struct AttestationContent {
pub spec_version: Box<str>,
pub source_hash: Box<str>,
pub crate_name: Box<str>,
pub crate_version: Box<str>,
pub analysis_tier: AnalysisTier,
pub timestamp: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub analysis_completeness: Option<AnalysisCompleteness>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rust_version: Option<Box<str>>,
pub profile: CapabilityProfile,
}