use serde_json::Value;
use std::collections::HashMap;
use std::sync::Arc;
pub trait NamedPredicate: Send + Sync {
fn name(&self) -> &str;
fn evaluate(&self, value: &Value, args: &Value) -> bool;
}
#[derive(Default)]
pub struct PredicateRegistry {
predicates: HashMap<String, Arc<dyn NamedPredicate>>,
}
impl PredicateRegistry {
pub fn new() -> Self {
Self::default()
}
pub fn register(&mut self, predicate: Arc<dyn NamedPredicate>) {
self.predicates
.insert(predicate.name().to_string(), predicate);
}
pub fn register_as(&mut self, name: impl Into<String>, predicate: Arc<dyn NamedPredicate>) {
self.predicates.insert(name.into(), predicate);
}
pub fn get(&self, name: &str) -> Option<&Arc<dyn NamedPredicate>> {
self.predicates.get(name)
}
}