Skip to main content

sz_rust_orm_facade/data_scope/
custom.rs

1//! 自定义条件生成器注册表 — CustomGeneratorRegistry
2
3use crate::data_scope::context::DataScopeContext;
4use crate::data_scope::error::DataScopeError;
5use crate::repository::WhereCondition;
6use async_trait::async_trait;
7use std::collections::HashMap;
8use std::sync::Arc;
9
10/// 自定义条件生成器 trait
11#[async_trait]
12pub trait CustomConditionGenerator: Send + Sync {
13    /// 生成器名称
14    fn name(&self) -> &str;
15
16    /// 生成 WHERE 条件列表
17    async fn generate(&self, ctx: &DataScopeContext)
18        -> Result<Vec<WhereCondition>, DataScopeError>;
19}
20
21/// 自定义条件生成器注册表
22pub struct CustomGeneratorRegistry {
23    generators: HashMap<String, Arc<dyn CustomConditionGenerator>>,
24}
25
26impl CustomGeneratorRegistry {
27    /// 创建空注册表
28    pub fn new() -> Self {
29        Self {
30            generators: HashMap::new(),
31        }
32    }
33
34    /// 注册生成器
35    pub fn register(&mut self, gen: Arc<dyn CustomConditionGenerator>) {
36        self.generators.insert(gen.name().to_string(), gen);
37    }
38
39    /// 查询生成器
40    pub fn get(&self, name: &str) -> Option<Arc<dyn CustomConditionGenerator>> {
41        self.generators.get(name).cloned()
42    }
43}
44
45impl Default for CustomGeneratorRegistry {
46    fn default() -> Self {
47        Self::new()
48    }
49}
50
51#[cfg(test)]
52mod tests {
53    use super::*;
54    use crate::repository::WhereOp;
55    use crate::Value;
56
57    struct RegionGenerator;
58
59    #[async_trait]
60    impl CustomConditionGenerator for RegionGenerator {
61        fn name(&self) -> &str {
62            "region_filter"
63        }
64
65        async fn generate(
66            &self,
67            _ctx: &DataScopeContext,
68        ) -> Result<Vec<WhereCondition>, DataScopeError> {
69            Ok(vec![WhereCondition::new(
70                "region",
71                WhereOp::Eq,
72                Value::String("CN".into()),
73            )])
74        }
75    }
76
77    #[test]
78    fn test_register_and_get() {
79        let mut registry = CustomGeneratorRegistry::new();
80        registry.register(Arc::new(RegionGenerator));
81        assert!(registry.get("region_filter").is_some());
82    }
83
84    #[test]
85    fn test_get_not_found() {
86        let registry = CustomGeneratorRegistry::new();
87        assert!(registry.get("nonexistent").is_none());
88    }
89
90    #[test]
91    fn test_default_is_empty() {
92        let registry = CustomGeneratorRegistry::default();
93        assert!(registry.get("any").is_none());
94    }
95
96    #[tokio::test]
97    async fn test_generate_produces_condition() {
98        let mut registry = CustomGeneratorRegistry::new();
99        registry.register(Arc::new(RegionGenerator));
100        let gen = registry.get("region_filter").unwrap();
101        let ctx = DataScopeContext::new(1, 5, false);
102        let conditions = gen.generate(&ctx).await.unwrap();
103        assert_eq!(conditions.len(), 1);
104        assert_eq!(conditions[0].field, "region");
105    }
106}