60 lines
1.6 KiB
Rust
60 lines
1.6 KiB
Rust
use erp_core::error::AppError;
|
|
|
|
#[derive(Debug, thiserror::Error)]
|
|
pub enum AiError {
|
|
#[error("验证失败: {0}")]
|
|
Validation(String),
|
|
|
|
#[error("分析未找到: {0}")]
|
|
AnalysisNotFound(String),
|
|
|
|
#[error("Prompt 模板未找到: {0}")]
|
|
PromptNotFound(String),
|
|
|
|
#[error("AI 提供商不可用: {0}")]
|
|
ProviderUnavailable(String),
|
|
|
|
#[error("AI 提供商错误: {0}")]
|
|
ProviderError(String),
|
|
|
|
#[error("数据脱敏失败: {0}")]
|
|
SanitizationError(String),
|
|
|
|
#[error("模板渲染失败: {0}")]
|
|
TemplateError(String),
|
|
|
|
#[error("速率超限")]
|
|
RateLimitExceeded,
|
|
|
|
#[error("版本不匹配")]
|
|
VersionMismatch,
|
|
|
|
#[error("数据库错误: {0}")]
|
|
DbError(String),
|
|
}
|
|
|
|
impl From<AiError> for AppError {
|
|
fn from(e: AiError) -> Self {
|
|
match e {
|
|
AiError::Validation(msg) => AppError::Validation(msg),
|
|
AiError::AnalysisNotFound(id) => AppError::NotFound(format!("分析结果: {id}")),
|
|
AiError::PromptNotFound(name) => AppError::NotFound(format!("Prompt 模板: {name}")),
|
|
AiError::ProviderUnavailable(p) => {
|
|
AppError::Internal(format!("AI 提供商 {p} 不可用"))
|
|
}
|
|
AiError::RateLimitExceeded => AppError::TooManyRequests,
|
|
AiError::VersionMismatch => AppError::VersionMismatch,
|
|
AiError::DbError(msg) => AppError::Internal(msg),
|
|
other => AppError::Internal(other.to_string()),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl From<sea_orm::DbErr> for AiError {
|
|
fn from(e: sea_orm::DbErr) -> Self {
|
|
AiError::DbError(e.to_string())
|
|
}
|
|
}
|
|
|
|
pub type AiResult<T> = Result<T, AiError>;
|