use thiserror::Error;
use warg_protocol::{package::PackageRecord, registry::PackageName, ProtoEnvelope};
mod authorization;
pub use authorization::*;
#[derive(Debug, Error)]
pub enum RecordPolicyError {
#[error("unauthorized operation:: {0}")]
Unauthorized(String),
#[error("record was rejected by policy: {0}")]
Rejection(String),
}
pub type RecordPolicyResult<T> = Result<T, RecordPolicyError>;
pub trait RecordPolicy: Send + Sync {
fn check(
&self,
name: &PackageName,
record: &ProtoEnvelope<PackageRecord>,
) -> RecordPolicyResult<()>;
}
#[derive(Default)]
pub struct RecordPolicyCollection {
policies: Vec<Box<dyn RecordPolicy>>,
}
impl RecordPolicyCollection {
pub fn new() -> Self {
Self::default()
}
pub fn push(&mut self, policy: impl RecordPolicy + 'static) {
self.policies.push(Box::new(policy));
}
}
impl RecordPolicy for RecordPolicyCollection {
fn check(
&self,
name: &PackageName,
record: &ProtoEnvelope<PackageRecord>,
) -> RecordPolicyResult<()> {
for policy in &self.policies {
policy.check(name, record)?;
}
Ok(())
}
}