use std::path::Path;
use crate::{Manifest, SkillError};
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum VerificationOutcome {
Verified,
Warning(Vec<String>),
Denied(String),
}
pub trait Verifier: Send + Sync {
fn verify(&self, manifest: &Manifest, root: &Path) -> Result<VerificationOutcome, SkillError>;
}
#[derive(Debug, Default, Clone, Copy)]
pub struct WarnOnlyVerifier;
impl Verifier for WarnOnlyVerifier {
fn verify(&self, manifest: &Manifest, _root: &Path) -> Result<VerificationOutcome, SkillError> {
if manifest.signature.is_some() {
Ok(VerificationOutcome::Verified)
} else {
Ok(VerificationOutcome::Warning(vec![
"unsigned skill manifest".to_string(),
]))
}
}
}
#[derive(Debug, Default, Clone, Copy)]
pub struct DenyVerifier;
impl Verifier for DenyVerifier {
fn verify(
&self,
_manifest: &Manifest,
_root: &Path,
) -> Result<VerificationOutcome, SkillError> {
Ok(VerificationOutcome::Denied(
"deny verifier: signatures rejected".to_string(),
))
}
}