use crate::error::AcdpError;
use crate::types::primitives::AgentDid;
pub trait RateLimiter: Send + Sync {
fn check_publish(&self, _agent_id: &AgentDid) -> Result<(), AcdpError> {
Ok(())
}
}
#[derive(Debug, Default, Clone, Copy)]
pub struct NoopRateLimiter;
impl RateLimiter for NoopRateLimiter {}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn noop_accepts_every_publish() {
let n = NoopRateLimiter;
n.check_publish(&AgentDid::new("did:web:agents.example.com:test"))
.unwrap();
}
struct DenyAgent {
deny: String,
}
impl RateLimiter for DenyAgent {
fn check_publish(&self, agent_id: &AgentDid) -> Result<(), AcdpError> {
if agent_id.as_str() == self.deny {
Err(AcdpError::RateLimited(format!("deny-list: {}", agent_id)))
} else {
Ok(())
}
}
}
#[test]
fn deny_agent_blocks_listed_did() {
let l = DenyAgent {
deny: "did:web:agents.example.com:noisy".into(),
};
let err = l
.check_publish(&AgentDid::new("did:web:agents.example.com:noisy"))
.unwrap_err();
assert!(matches!(err, AcdpError::RateLimited(_)));
l.check_publish(&AgentDid::new("did:web:agents.example.com:quiet"))
.unwrap();
}
}