From 17d596c51254cdafdc8c078cc095b1ef71061b73 Mon Sep 17 00:00:00 2001 From: xfy Date: Thu, 23 Jul 2026 13:32:46 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=B8=85=E7=90=86=E6=AD=BB?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=B8=8E=E5=86=97=E4=BD=99=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=20mhchem=20=E6=A8=A1=E5=9D=97=E7=9A=84=20clippy=20?= =?UTF-8?q?=E9=98=BB=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit mhchem 机械移植引入了一个 deny-by-default 的 useless_attribute 硬错误 (mhchem_tables.rs 顶部的 outer #[allow] 挂在 use 语句上),导致 make lint / CI check job 失败。顺带清理同模块的死代码与风格项,以及仓库 内其他确认无引用的死代码。 - mhchem_tables.rs: 删除无效 outer allow、未使用的 `use super::*`、 pq_action 未用形参 buf→_buf;v.get(0)→v.first() - mhchem.rs: 删除从未调用的 Field::empty;修正 &*RE→&RE、Default 字段 重赋值;Parsed/Out 加 large_enum_variant allow(镜像上游结构, 经 Vec 进堆,非栈热路径) - codemirror_bridge.rs: 删除 SqlSchema/SqlTable 上过期的 dead_code allow——get_db_schema 早已消费这两个类型 - ssr_cache.rs: 删除生产路径从未调用的 invalidate_ssr_home(首页已由 invalidate_ssr_all_public 覆盖),修正相关注释与测试 - auth.rs: 删除预留给未实现用户管理功能的 invalidate_user_sessions 验证:cargo clippy --all-targets --all-features -- -D warnings 通过; mhchem/ssr_cache 共 20 项测试通过。 --- src/api/auth.rs | 20 -------------------- src/api/mhchem.rs | 25 ++++++++++--------------- src/api/mhchem_tables.rs | 10 +++------- src/codemirror_bridge.rs | 3 --- src/ssr_cache.rs | 20 +++----------------- 5 files changed, 16 insertions(+), 62 deletions(-) diff --git a/src/api/auth.rs b/src/api/auth.rs index 9ea5799..89845c2 100644 --- a/src/api/auth.rs +++ b/src/api/auth.rs @@ -417,26 +417,6 @@ pub async fn get_user_by_token(token: &str) -> Result, Serve Ok(user) } -#[cfg(feature = "server")] -/// 使指定用户的所有 session 立即失效:bump `session_generation`。 -/// -/// 用于角色降级、封禁、密码修改等场景。bump 后该用户所有已签发 session 在下次 -/// `get_user_by_token` 时因世代不匹配被逐出缓存并视为未登录。内存缓存无需主动清, -/// 惰性逐出即可。当前仓库无运行时角色变更入口,本函数是为未来「用户管理」功能 -/// 预备的基础设施,一旦引入降级/封禁的 server function,必须在 UPDATE 后调用。 -#[allow(dead_code)] // 预留给未来的用户管理功能(角色变更/封禁触发全量 session 失效) -pub async fn invalidate_user_sessions(user_id: i32) -> Result<(), ServerFnError> { - let client = get_conn().await.map_err(AppError::db_conn)?; - client - .execute( - "UPDATE users SET session_generation = session_generation + 1 WHERE id = $1", - &[&user_id], - ) - .await - .map_err(AppError::query)?; - Ok(()) -} - /// 获取当前登录用户的公开信息。 /// /// Dioxus server function,注册在 `/api` 路径下。 diff --git a/src/api/mhchem.rs b/src/api/mhchem.rs index f685de3..f7a5dd7 100755 --- a/src/api/mhchem.rs +++ b/src/api/mhchem.rs @@ -51,16 +51,8 @@ enum Field { Nodes(Vec), } -impl Field { - fn empty(&self) -> bool { - match self { - Field::Str(s) => s.is_empty(), - Field::Nodes(v) => v.is_empty(), - } - } -} - /// 解析中间表示:字面字符串或节点。 +#[allow(clippy::large_enum_variant)] // 机械移植:镜像 mhchemParser 上游结构,Parsed 经 Vec 进堆,非栈热路径 #[derive(Clone, Debug)] enum Parsed { S(String), @@ -398,11 +390,11 @@ fn match_pattern(name: &str, input: &str) -> Option { "x" => re_match(re!("^x")), "x$" => re_match(re!("^x$")), "i$" => re_match(re!("^i$")), - "letters" => re_match(&*LETTERS_RE), - "\\greek" => re_match(&*GREEK_RE), + "letters" => re_match(&LETTERS_RE), + "\\greek" => re_match(&GREEK_RE), "one lowercase latin letter $" => re_match(re!("^(?:([a-z])(?:$|[^a-zA-Z]))$")), "$one lowercase latin letter$ $" => re_match(re!("^\\$(?:([a-z])(?:$|[^a-zA-Z]))\\$$")), - "one lowercase greek letter $" => re_match(&*ONE_GREEK_RE), + "one lowercase greek letter $" => re_match(&ONE_GREEK_RE), "digits" => re_match(re!("^[0-9]+")), "-9.,9" => re_match(re!("^[+\\-]?(?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+))")), "-9.,9 no missing 0" => re_match(re!("^[+\\-]?[0-9]+(?:[.,][0-9]+)?")), @@ -596,6 +588,7 @@ fn mval_str(m: &MVal) -> String { // 状态机主循环(对应 `_mhchemParser.go`) // ========================================================================= +#[allow(clippy::large_enum_variant)] // 同上:Out 为动作返回值,瞬态使用 enum Out { None, One(Parsed), @@ -622,8 +615,10 @@ fn go(input: &str, machine: &str) -> Vec { let transitions = transitions_for(machine); let mut state = String::from("0"); - let mut buffer = Buffer::default(); - buffer.parenthesis_level = 0; + let mut buffer = Buffer { + parenthesis_level: 0, + ..Default::default() + }; let mut output: Vec = Vec::new(); let mut last_input: Option = None; let mut watchdog = 10i32; @@ -753,7 +748,7 @@ fn generic_action(buf: &mut Buffer, m: &MVal, opt: &Option, type_: &str) if let (Some(a), MVal::V(v)) = (opt, m) { Out::One(Parsed::N(NodeData { type_: a.clone(), - p1: Some(Field::Str(v.get(0).cloned().unwrap_or_default())), + p1: Some(Field::Str(v.first().cloned().unwrap_or_default())), p2: Some(Field::Str(v.get(1).cloned().unwrap_or_default())), ..Default::default() })) diff --git a/src/api/mhchem_tables.rs b/src/api/mhchem_tables.rs index 2ed9f54..b69270d 100644 --- a/src/api/mhchem_tables.rs +++ b/src/api/mhchem_tables.rs @@ -2,10 +2,6 @@ // 数据机械移植自 mhchemParser 4.2.2 的 `stateMachines`。 // (被 include 进 mhchem.rs 中部,故不能用 `//!` 内部文档注释。) -#[allow(clippy::needless_pass_by_value)] - -use super::*; - // ── Task 构造器 ────────────────────────────────────────────────────────── fn task(acts: &[(&str, Option<&str>)], next: Option<&str>, revisit: bool, cont: bool) -> Task { @@ -1220,7 +1216,7 @@ fn text_action(buf: &mut Buffer, type_: &str) -> Option { } } -fn pq_action(buf: &mut Buffer, m: &MVal, type_: &str) -> Option { +fn pq_action(_buf: &mut Buffer, m: &MVal, type_: &str) -> Option { match type_ { "state of aggregation" => Some(Out::One(Parsed::N(NodeData { type_: "state of aggregation subscript".into(), @@ -1307,7 +1303,7 @@ fn pu_action(buf: &mut Buffer, m: &MVal, opt: &Option, type_: &str) -> O MVal::S(s) => vec![s.clone()], }; let mut ret: Vec = Vec::new(); - let g0 = v.get(0).map(|s| s.as_str()).unwrap_or(""); + let g0 = v.first().map(|s| s.as_str()).unwrap_or(""); if g0 == "+-" || g0 == "+/-" { ret.push(Parsed::S("\\pm ".into())); } else if !g0.is_empty() { @@ -1352,7 +1348,7 @@ fn pu_action(buf: &mut Buffer, m: &MVal, opt: &Option, type_: &str) -> O MVal::S(s) => vec![s.clone()], }; let mut ret: Vec = Vec::new(); - let g0 = v.get(0).map(|s| s.as_str()).unwrap_or(""); + let g0 = v.first().map(|s| s.as_str()).unwrap_or(""); if g0 == "+-" || g0 == "+/-" { ret.push(Parsed::S("\\pm ".into())); } else if !g0.is_empty() { diff --git a/src/codemirror_bridge.rs b/src/codemirror_bridge.rs index c4d495d..4174718 100644 --- a/src/codemirror_bridge.rs +++ b/src/codemirror_bridge.rs @@ -11,15 +11,12 @@ use serde::{Deserialize, Serialize}; /// SQL 补全用 schema 数据,由 `get_db_schema` server function 填充。 -// 暂未被消费(Task 5 的 get_db_schema 会用到),先 allow dead_code 避免 -D warnings 阻断 clippy。 -#[allow(dead_code)] #[derive(Serialize, Deserialize, Clone, Default, Debug)] pub struct SqlSchema { pub tables: Vec, } /// 单张表的补全数据:表名 + 列名列表。 -#[allow(dead_code)] #[derive(Serialize, Deserialize, Clone, Debug)] pub struct SqlTable { pub name: String, diff --git a/src/ssr_cache.rs b/src/ssr_cache.rs index 5a50019..bebfe68 100644 --- a/src/ssr_cache.rs +++ b/src/ssr_cache.rs @@ -50,7 +50,7 @@ fn route_cache_dir(route: &str) -> Option { path.push(seg); } if path.as_path() == std::path::Path::new(SSR_CACHE_ROOT) { - None // 根路由("/")单独由 invalidate_ssr_home 处理 + None // 根路由("/")无目录段;首页缓存由 invalidate_ssr_all_public 覆盖删除 } else { Some(path) } @@ -72,19 +72,6 @@ pub fn invalidate_ssr_route(route: &str) { } } -/// 失效首页 SSR 缓存(路由 `/`,落盘在 `static/index/`)。 -/// -/// 通常 [`invalidate_ssr_all_public`] 已覆盖首页;本函数留作只需刷新首页的细粒度场景。 -#[allow(dead_code)] -pub fn invalidate_ssr_home() { - let dir = PathBuf::from(SSR_CACHE_ROOT).join("index"); - match std::fs::remove_dir_all(&dir) { - Ok(()) => tracing::debug!("SSR 首页缓存已删除"), - Err(e) if e.kind() == std::io::ErrorKind::NotFound => {} - Err(e) => tracing::warn!(error = %e, "删除 SSR 首页缓存失败"), - } -} - /// 失效所有公开页 SSR 缓存(删除 `static/` 下除 `.well-known`、`admin` 外的全部)。 /// /// 用于批量重建等影响面广的写入。保留 `.well-known`(浏览器/PWA 元数据, @@ -112,7 +99,7 @@ pub fn invalidate_ssr_all_public() { /// 原子递增并返回新的全局世代号。 /// /// 仅作可观测性用途(注入 `X-SSR-Generation` 响应头)。实际 SSR 缓存失效由 -/// [`invalidate_ssr_route`] / [`invalidate_ssr_home`] 物理删文件完成。 +/// [`invalidate_ssr_route`] 物理删文件完成(首页由 [`invalidate_ssr_all_public`] 覆盖)。 pub fn bump_global_generation() -> u64 { let new = GLOBAL_GENERATION .fetch_add(1, Ordering::SeqCst) @@ -164,7 +151,7 @@ mod tests { #[test] fn route_cache_dir_none_for_root() { - // 根路由 "/" 无目录段,由 invalidate_ssr_home 单独处理。 + // 根路由 "/" 无目录段(首页缓存由 invalidate_ssr_all_public 覆盖)。 assert!(route_cache_dir("/").is_none()); assert!(route_cache_dir("").is_none()); } @@ -195,6 +182,5 @@ mod tests { // (若真实环境已有 static/,本测试不会误删——read_dir 对每个条目单独删, // 这里仅验证根缺失分支。) invalidate_ssr_all_public(); - invalidate_ssr_home(); } }