moduforge-rules-engine 0.5.0

moduforge 引擎规则
Documentation
use crate::EvaluationError;
use ahash::HashMap;
use jsonschema::Validator;
use serde_json::Value;
use std::sync::Arc;
use tokio::sync::RwLock;

#[derive(Clone, Default, Debug)]
pub struct ValidatorCache {
    inner: Arc<RwLock<HashMap<u64, Arc<Validator>>>>,
}

impl ValidatorCache {
    pub async fn get(
        &self,
        key: u64,
    ) -> Option<Arc<Validator>> {
        let read = self.inner.read().await;
        read.get(&key).cloned()
    }

    pub async fn get_or_insert(
        &self,
        key: u64,
        schema: &Value,
    ) -> Result<Arc<Validator>, Box<EvaluationError>> {
        if let Some(v) = self.get(key).await {
            return Ok(v);
        }

        let mut w_shared = self.inner.write().await;
        let validator = Arc::new(jsonschema::draft7::new(&schema)?);
        w_shared.insert(key, validator.clone());

        Ok(validator)
    }
}