use crate::{dto::error::Error, dto::rpc::Request};
use async_trait::async_trait;
use super::RootCapabilityProof;
pub(super) struct VerifiedCapability;
pub(super) struct VerificationInput<'a> {
pub(super) capability: &'a Request,
}
#[async_trait]
pub(super) trait CapabilityProofVerifier {
async fn verify(&self, input: &VerificationInput<'_>) -> Result<VerifiedCapability, Error>;
}
struct StructuralVerifier;
#[async_trait]
impl CapabilityProofVerifier for StructuralVerifier {
async fn verify(&self, input: &VerificationInput<'_>) -> Result<VerifiedCapability, Error> {
super::proof::verify_root_structural_proof(input.capability)?;
Ok(VerifiedCapability)
}
}
pub(super) async fn verify_root_capability_proof(
capability: &Request,
_capability_version: u16,
proof: RootCapabilityProof,
) -> Result<VerifiedCapability, Error> {
let input = VerificationInput { capability };
match proof {
RootCapabilityProof::Structural => StructuralVerifier.verify(&input).await,
}
}