sz_rust_orm_facade/data_scope/
custom.rs1use 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#[async_trait]
12pub trait CustomConditionGenerator: Send + Sync {
13 fn name(&self) -> &str;
15
16 async fn generate(&self, ctx: &DataScopeContext)
18 -> Result<Vec<WhereCondition>, DataScopeError>;
19}
20
21pub struct CustomGeneratorRegistry {
23 generators: HashMap<String, Arc<dyn CustomConditionGenerator>>,
24}
25
26impl CustomGeneratorRegistry {
27 pub fn new() -> Self {
29 Self {
30 generators: HashMap::new(),
31 }
32 }
33
34 pub fn register(&mut self, gen: Arc<dyn CustomConditionGenerator>) {
36 self.generators.insert(gen.name().to_string(), gen);
37 }
38
39 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}