Skip to main content

sz_rust_orm_facade/data_scope/
error.rs

1//! 数据范围错误类型
2
3use thiserror::Error;
4
5/// 数据范围控制错误
6#[derive(Debug, Clone, Error)]
7pub enum DataScopeError {
8    /// 请求上下文缺失 `UserContext`(spec 5.3.1.8 + 4.3.3)
9    #[error("missing user context in request extension")]
10    MissingUserContext,
11
12    /// 部门树不可用(缓存未初始化或 provider 返回错误)
13    #[error("dept tree unavailable: {0}")]
14    DeptTreeUnavailable(String),
15
16    /// 规则无效(字段缺失或模式不匹配)
17    #[error("invalid data scope rule: {0}")]
18    InvalidRule(String),
19
20    /// 自定义条件不安全(非参数化绑定)
21    #[error("unsafe custom condition: {0}")]
22    UnsafeCustomCondition(String),
23
24    /// 自定义条件生成器未注册
25    #[error("custom generator not found: {0}")]
26    GeneratorNotFound(String),
27}
28
29impl DataScopeError {
30    /// 错误码(用于指标 label 和日志)
31    pub fn error_code(&self) -> &'static str {
32        match self {
33            Self::MissingUserContext => "DATA_SCOPE_NO_USER_CONTEXT",
34            Self::DeptTreeUnavailable(_) => "DATA_SCOPE_DEPT_TREE_UNAVAILABLE",
35            Self::InvalidRule(_) => "DATA_SCOPE_INVALID_RULE",
36            Self::UnsafeCustomCondition(_) => "DATA_SCOPE_UNSAFE_CUSTOM",
37            Self::GeneratorNotFound(_) => "DATA_SCOPE_GENERATOR_NOT_FOUND",
38        }
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn test_error_codes() {
48        assert_eq!(
49            DataScopeError::MissingUserContext.error_code(),
50            "DATA_SCOPE_NO_USER_CONTEXT"
51        );
52        assert_eq!(
53            DataScopeError::DeptTreeUnavailable("x".into()).error_code(),
54            "DATA_SCOPE_DEPT_TREE_UNAVAILABLE"
55        );
56        assert_eq!(
57            DataScopeError::InvalidRule("x".into()).error_code(),
58            "DATA_SCOPE_INVALID_RULE"
59        );
60        assert_eq!(
61            DataScopeError::UnsafeCustomCondition("x".into()).error_code(),
62            "DATA_SCOPE_UNSAFE_CUSTOM"
63        );
64        assert_eq!(
65            DataScopeError::GeneratorNotFound("x".into()).error_code(),
66            "DATA_SCOPE_GENERATOR_NOT_FOUND"
67        );
68    }
69}