pub mod abstraction;
pub use abstraction::{
BanSafeError, ConfigSafeError, ErrorMessageAbstraction, GeneralSafeError, LimitSafeError,
SafeErrorMessage, StorageSafeError, ValidationSafeError,
};
use thiserror::Error;
mod error_impl;
#[derive(Error, Debug)]
pub enum LimiteronError {
#[error("配置错误: {0}")]
ConfigError(String),
#[error("存储错误: {0}")]
StorageError(#[from] StorageError),
#[error("限流错误: {0}")]
LimitError(String),
#[error("封禁错误: {0}")]
BanError(String),
#[error("熔断器错误: {0}")]
CircuitBreakerError(String),
#[error("降级错误: {0}")]
FallbackError(String),
#[error("审计日志错误: {0}")]
AuditLogError(String),
#[error("授权错误: {0}")]
AuthorizationError(String),
#[error("IO错误: {0}")]
IoError(#[from] std::io::Error),
#[error("序列化错误: {0}")]
SerdeError(#[from] serde_json::Error),
#[error("YAML解析错误: {0}")]
YamlError(#[from] serde_yaml_ng::Error),
#[error("速率限制超出: {0}")]
RateLimitExceeded(String),
#[error("配额超出: {0}")]
QuotaExceeded(String),
#[error("并发限制超出: {0}")]
ConcurrencyLimitExceeded(String),
#[error("验证错误: {0}")]
ValidationError(String),
#[error("锁获取错误: {0}")]
LockError(String),
#[error("时间错误: {0}")]
TimeError(String),
#[error("依赖缺失: {0}")]
DependencyError(String),
#[error("未知错误: {0}")]
Other(String),
}
#[derive(Error, Debug, Clone)]
pub enum StorageError {
#[error("连接错误: {0}")]
ConnectionError(String),
#[error("查询错误: {0}")]
QueryError(String),
#[error("超时错误: {0}")]
TimeoutError(String),
#[error("未找到: {0}")]
NotFound(String),
#[error("认证错误: {0}")]
AuthenticationError(String),
#[error("权限错误: {0}")]
PermissionError(String),
#[error("无效配置: {0}")]
InvalidConfig(String),
#[error("速率限制: {0}")]
RateLimitError(String),
#[error("验证错误: {0}")]
ValidationError(String),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum CircuitState {
Closed,
Open,
HalfOpen,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct CircuitBreakerStats {
pub state: CircuitState,
pub failure_count: u64,
pub success_count: u64,
pub total_calls: u64,
pub last_failure_time: Option<chrono::DateTime<chrono::Utc>>,
pub last_state_change: Option<chrono::DateTime<chrono::Utc>>,
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct RateLimitMetadata {
pub limit: u64,
pub remaining: u64,
pub reset_at: u64,
pub retry_after: Option<u64>,
pub policy: String,
}
#[derive(Debug, Clone, PartialEq)]
pub struct RejectionMetadata {
pub reason: String,
pub retry_after: u64,
pub limit: u64,
pub reset_at: u64,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Decision {
Allowed(RateLimitMetadata),
Rejected(RejectionMetadata),
Banned(BanInfo),
}
#[derive(Debug, Clone, PartialEq)]
pub struct BanInfo {
reason: String,
banned_until: chrono::DateTime<chrono::Utc>,
ban_times: u32,
}
#[derive(Debug, Clone)]
pub struct ConsumeResult {
pub allowed: bool,
pub remaining: u64,
pub alert_triggered: bool,
pub usage_percent: f64,
}
pub type LimiteronResult<T> = std::result::Result<T, LimiteronError>;