use super::context::AuditContext;
use super::kinds::FileRole;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RoleEvidenceSource {
Path,
Content,
Framework,
Manifest,
Signal,
Mixed,
Fallback,
}
impl RoleEvidenceSource {
pub fn as_id(self) -> &'static str {
match self {
RoleEvidenceSource::Path => "path",
RoleEvidenceSource::Content => "content",
RoleEvidenceSource::Framework => "framework",
RoleEvidenceSource::Manifest => "manifest",
RoleEvidenceSource::Signal => "signal",
RoleEvidenceSource::Mixed => "mixed",
RoleEvidenceSource::Fallback => "fallback",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct RoleEvidence {
pub role: FileRole,
pub source: RoleEvidenceSource,
pub reason: &'static str,
}
impl RoleEvidence {
pub const fn new(role: FileRole, source: RoleEvidenceSource, reason: &'static str) -> Self {
Self {
role,
source,
reason,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct FileContextClassification {
pub context: AuditContext,
pub role_evidence: Vec<RoleEvidence>,
}
impl FileContextClassification {
pub fn evidence_for_role(&self, role: FileRole) -> Option<&RoleEvidence> {
self.role_evidence
.iter()
.find(|evidence| evidence.role == role)
}
}