1use tihu::api::Response;
2use tihu::SharedString;
3
4#[derive(thiserror::Error, Debug)]
5pub enum ErrNo {
6 #[error("用户未登录")]
7 LoginRequired,
8 #[error("{0}")]
9 CommonError(SharedString),
10 #[error("{0}")]
11 Other(#[from] anyhow::Error),
12 #[error("配置错误,{0}")]
13 ConfigError(SharedString),
14 #[error("任务超时,{0}")]
15 Timeout(SharedString),
16 #[error("没有可用的{0}服务")]
17 NoService(SharedString),
18 #[error("{0}服务忙")]
19 ServiceBusy(SharedString),
20 #[error("暂停服务")]
21 ServicePaused,
22 #[error("接口不存在")]
23 NoSuchApi,
24 #[error("序列化数据失败,{0}")]
25 SerializeError(serde_json::Error),
26 #[error("反序列化数据失败,{0}")]
27 DeserializeError(serde_json::Error),
28 #[error("调用远程接口失败,{0}")]
29 ApiError(anyhow::Error),
30 #[error("只支持UTF-8格式的数据")]
31 Utf8Only,
32 #[error("参数格式不正确")]
33 ParamFormatError,
34 #[error("参数无效,{0}")]
35 ParamInvalid(SharedString),
36 #[error("令牌无效")]
37 TokenInvalid,
38 #[error("没有权限")]
39 NotAllowed,
40 #[error("访问太频繁")]
41 TooFrequent,
42 #[error("文件上传请求格式不正确")]
43 MultipartRequired,
44 #[error("未定义的枚举值,{0}")]
45 UndefinedEnumValue(SharedString),
46 #[error("没有数据库连接")]
47 NoDbClient,
48 #[error("预编译sql失败,{0}")]
49 PrepareStatementError(anyhow::Error),
50 #[error("查询数据失败,{0}")]
51 QueryError(anyhow::Error),
52 #[error("数据操作失败,{0}")]
53 ExecuteError(anyhow::Error),
54 #[error("开启数据库事务失败,{0}")]
55 OpenTransactionError(anyhow::Error),
56 #[error("获取数据字段失败,{0}")]
57 ExtractDataError(anyhow::Error),
58 #[error("提交数据库事务失败,{0}")]
59 CommitTransactionError(anyhow::Error),
60 #[error("没有缓存连接")]
61 NoCacheClient,
62 #[error("缓存操作失败,{0}")]
63 CacheOperationError(anyhow::Error),
64}
65
66impl ErrNo {
67 pub fn code(&self) -> i32 {
68 return match *self {
69 ErrNo::LoginRequired => -1,
70 ErrNo::CommonError(_) => -2,
71 ErrNo::Other(_) => -3,
72 ErrNo::ConfigError(_) => -4,
73 ErrNo::Timeout(_) => -5,
74 ErrNo::NoService(_) => -6,
75 ErrNo::ServiceBusy(_) => -7,
76 ErrNo::ServicePaused => -8,
77 ErrNo::NoSuchApi => -9,
78 ErrNo::SerializeError(_) => -10,
79 ErrNo::DeserializeError(_) => -11,
80 ErrNo::ApiError(_) => -12,
81 ErrNo::Utf8Only => -13,
82 ErrNo::ParamFormatError => -14,
83 ErrNo::ParamInvalid(_) => -15,
84 ErrNo::TokenInvalid => -16,
85 ErrNo::NotAllowed => -17,
86 ErrNo::TooFrequent => -18,
87 ErrNo::MultipartRequired => -19,
88 ErrNo::UndefinedEnumValue(_) => -20,
89 ErrNo::NoDbClient => -21,
90 ErrNo::PrepareStatementError(_) => -22,
91 ErrNo::QueryError(_) => -23,
92 ErrNo::ExecuteError(_) => -24,
93 ErrNo::OpenTransactionError(_) => -25,
94 ErrNo::ExtractDataError(_) => -26,
95 ErrNo::CommitTransactionError(_) => -27,
96 ErrNo::NoCacheClient => -28,
97 ErrNo::CacheOperationError(_) => -29,
98 };
99 }
100 pub fn message(&self) -> SharedString {
101 return self.to_string().into();
102 }
103}
104
105impl<T> From<ErrNo> for Response<T> {
106 fn from(err_no: ErrNo) -> Response<T> {
107 return Response::failure(err_no.code(), err_no.message(), None);
108 }
109}
110
111pub fn open_transaction_error<E>(error: E) -> ErrNo
112where
113 E: std::error::Error + Send + Sync + 'static,
114{
115 ErrNo::OpenTransactionError(error.into())
116}
117
118pub fn prepare_statement_error<E>(error: E) -> ErrNo
119where
120 E: std::error::Error + Send + Sync + 'static,
121{
122 ErrNo::PrepareStatementError(error.into())
123}
124
125pub fn query_error<E>(error: E) -> ErrNo
126where
127 E: std::error::Error + Send + Sync + 'static,
128{
129 ErrNo::QueryError(error.into())
130}
131
132pub fn undefined_enum_value(err_msg: SharedString) -> ErrNo {
133 ErrNo::UndefinedEnumValue(err_msg)
134}
135
136pub fn extract_data_error<E>(error: E) -> ErrNo
137where
138 E: std::error::Error + Send + Sync + 'static,
139{
140 ErrNo::ExtractDataError(error.into())
141}
142
143pub fn execute_error<E>(error: E) -> ErrNo
144where
145 E: std::error::Error + Send + Sync + 'static,
146{
147 ErrNo::ExecuteError(error.into())
148}
149
150pub fn commit_transaction_error<E>(error: E) -> ErrNo
151where
152 E: std::error::Error + Send + Sync + 'static,
153{
154 ErrNo::CommitTransactionError(error.into())
155}