From 2d121023903bb7f5ece28599621d4ea3ae9d2f71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9E=97=E4=BC=9F?= Date: Wed, 6 May 2026 13:47:56 +0800 Subject: [PATCH 1/3] chore: add .worktrees/ to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ea8c4bf..cc2e6ce 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +.worktrees/ From 3ef4a89de1f140d52f044844210fad9b9f6ccc21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9E=97=E4=BC=9F?= Date: Wed, 6 May 2026 13:50:26 +0800 Subject: [PATCH 2/3] refactor(api): remove SessionExpiredError, return ApiError with 'Invalid bot token' --- src/wechat/api.rs | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/wechat/api.rs b/src/wechat/api.rs index a019a72..20c4e81 100644 --- a/src/wechat/api.rs +++ b/src/wechat/api.rs @@ -41,19 +41,9 @@ impl fmt::Display for ApiError { impl StdError for ApiError {} -#[derive(Debug)] -pub struct SessionExpiredError; - -impl fmt::Display for SessionExpiredError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str("Session expired") - } -} - -impl StdError for SessionExpiredError {} - pub fn is_session_expired(err: &anyhow::Error) -> bool { - err.is::() + err.downcast_ref::() + .is_some_and(|e| e.code == SESSION_EXPIRED_ERRCODE) } pub(crate) fn build_http_client() -> Client { @@ -198,7 +188,11 @@ impl WeixinApiClient { // Priority 1: errcode (often for session/auth errors) if let Some(code) = status.errcode { if code == SESSION_EXPIRED_ERRCODE { - return Err(SessionExpiredError.into()); + return Err(ApiError { + code, + message: "Invalid bot token".to_string(), + } + .into()); } if code != 0 { return Err(ApiError { @@ -344,8 +338,9 @@ mod tests { let res: Result = WeixinApiClient::decode_response(bytes); assert!(res.is_err()); let err = res.unwrap_err(); - assert!(is_session_expired(&err)); - assert!(err.to_string().contains("Session expired")); + assert!(err.is::()); + assert!(err.to_string().contains("Invalid bot token")); + assert!(err.to_string().contains("-14")); } #[test] From 062d83f9690c29d0391078f8a005deb266d06cb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9E=97=E4=BC=9F?= Date: Wed, 6 May 2026 13:57:17 +0800 Subject: [PATCH 3/3] test(api): restore is_session_expired assertion in session expired test --- src/wechat/api.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/wechat/api.rs b/src/wechat/api.rs index 20c4e81..5225c2d 100644 --- a/src/wechat/api.rs +++ b/src/wechat/api.rs @@ -339,6 +339,7 @@ mod tests { assert!(res.is_err()); let err = res.unwrap_err(); assert!(err.is::()); + assert!(is_session_expired(&err)); assert!(err.to_string().contains("Invalid bot token")); assert!(err.to_string().contains("-14")); }