From f4b5a73594d9ab0efafaab293c5c3bf61263c47e Mon Sep 17 00:00:00 2001 From: AskaEth Date: Fri, 13 Nov 2026 03:20:00 +0800 Subject: [PATCH] =?UTF-8?q?refactor(setting):=20download=20=E5=9B=9B?= =?UTF-8?q?=E9=94=AE=E7=BA=AF=E6=90=AC=E7=A7=BB=E5=88=B0=20setting/keys/do?= =?UTF-8?q?wnload.rs=EF=BC=88M292=201/2=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `keys.rs` 396 行、贴着全仓 400 行硬线,M292 要再加三个键 ⇒ 先纯搬移腾地方。 - 新增 `crates/core/src/setting/keys/download.rs`:并发 / 单源尝试次数 / 地区判定 / 镜像偏好四条登记项,**逐字搬来**(唯一机械变换是 `.with(` 外壳换成 `vec![` 项、 `))` 换成 `),` 定界符)。 - `keys.rs` 原地换成一行 `.with_all(download::specs())`,登记顺序不变。 逐字节证明(搬移块 28 行): git show HEAD~1:crates/core/src/setting/keys.rs | sed -n '109,136p' \ | sed -e 's/^ \.with(/ /' -e 's/^ ))$/ ),/' > old.txt sed -n '/^ vec!\[$/,/^ \]$/p' keys/download.rs | sed '1d;$d' > new.txt diff -u old.txt new.txt; echo $? # 0 两条归一化规则都是**行首精确缩进锚定**:块内 `.with(` 只出现在四个项首、`))` 只出现在 四个项尾(各 4 处,与项数一一对应),所以它们不可能顺手改掉块内的真实差异。 --- crates/core/src/setting/keys.rs | 36 +++-------------- crates/core/src/setting/keys/download.rs | 49 ++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 30 deletions(-) create mode 100644 crates/core/src/setting/keys/download.rs diff --git a/crates/core/src/setting/keys.rs b/crates/core/src/setting/keys.rs index 7cba6a7..7b860c7 100644 --- a/crates/core/src/setting/keys.rs +++ b/crates/core/src/setting/keys.rs @@ -37,8 +37,9 @@ pub const JAVA_INSTALL_ROOT_UNSET: &str = ""; /// 必须同一份集合(setting 层不依赖 game 层),一致性由 `tests/setting/java_install_keys.rs` 守。 pub const JDK_VENDORS: &[&str] = &["temurin", "oracle", "microsoft", "zulu", "termux"]; -/// 拆到各自文件的键域:中文字体 CDN(M168)/ 自更新(M161)/ 代理与 gh-proxy(M197)。 -/// 主表各留一行登记。 +/// 拆到各自文件的键域:中文字体 CDN(M168)/ 自更新(M161)/ 代理与 gh-proxy(M197)/ +/// 下载调优四键(M292)。主表各留一行登记。 +pub mod download; pub mod font; pub mod proxy; pub mod update; @@ -106,34 +107,9 @@ pub fn launcher_schema() -> SettingSchema { AiPolicy::sensitive(), "实例默认隔离模式:isolated(运行目录派生 versions/<版本 id>,D20 默认)/ shared(所有实例共用 .minecraft 根)", )) - .with(SettingSpec::int( - "download.concurrency", - crate::download::config::DEFAULT_MAX_CONCURRENCY as i64, - (1, crate::download::config::MAX_CONCURRENCY as i64), - AiPolicy::silent(), - "同时下载的文件数(1~64,出厂 8)。这是引擎真实持有的并发许可,不是展示值;越界或手改坏值按出厂值生效", - )) - .with(SettingSpec::int( - "download.retry_limit", - crate::download::config::DEFAULT_MAX_ATTEMPTS_PER_SOURCE as i64, - (0, crate::download::config::MAX_ATTEMPTS_PER_SOURCE as i64), - AiPolicy::silent(), - "单个下载源的最多尝试次数(含首次;出厂 3)。0 与 1 都等于「只试一次、不重试」——0 是旧版 GUI 提供过的档位,保留合法但不代表「不下载」。换源不受此限", - )) - .with(SettingSpec::enumeration( - "download.region", - "auto", - REGIONS, - AiPolicy::audited(), - "下载地区判定:auto(时区+语言+探测)/ cn / global", - )) - .with(SettingSpec::enumeration( - "download.mirror_preference", - "auto", - MIRROR_PREFERENCES, - AiPolicy::audited(), - "镜像偏好:auto(健康度评分)/ official(官方源优先)/ mirror(镜像优先)", - )) + // M292:下载调优四键(并发 / 单源尝试次数 / 地区 / 镜像偏好)搬到 [`download`]——主表这一行 + // 代替原先四条 `.with(..)`,登记顺序与搬到那边之前逐项相同。 + .with_all(download::specs()) // M197:代理与 gh-proxy 三键(`download.proxy_mode` / `proxy_url` / `gh_proxy`)搬到 // [`proxy`]——主表这一段的注释也一起搬过去,见那个模块的表格。 .with_all(proxy::specs()) diff --git a/crates/core/src/setting/keys/download.rs b/crates/core/src/setting/keys/download.rs new file mode 100644 index 0000000..ff21e79 --- /dev/null +++ b/crates/core/src/setting/keys/download.rs @@ -0,0 +1,49 @@ +//! `download.*` 的基础四键(M292 从 `keys.rs` 纯搬移拆出:那边 396 行、贴着 400 行硬线)。 +//! +//! 搬移范围与顺序都未改:并发 / 单源尝试次数 / 地区判定 / 镜像偏好,四项逐字搬来,主表只留 +//! `.with_all(download::specs())` 一行。语义与「谁消费」仍写在各自的 `doc` 里(那是给界面与 +//! AI 的 JSON Schema `description`,不是本文件的注释),所以这里不再抄第二份。 +//! +//! 与 [`super::proxy`] 的分工:代理 / gh-proxy 三个键在那边(它们问的是「怎么把包拿到手」, +//! 而本文件这四个问的是「怎么排队、怎么重试、从哪个源拿」)。M292 新增的三个超时键 +//! (吞吐下限 / 无进展窗口 / 单次请求上界)也登记在本文件,它们与并发、重试同属「下载调优」, +//! 而**改它们的代价**只写在一处:`core::download::stall` 的模块头。 + +use crate::setting::spec::{AiPolicy, SettingSpec}; + +use super::{MIRROR_PREFERENCES, REGIONS}; + +/// 四个基础键的完整登记项(主表一行 `.with_all(download::specs())`)。 +#[must_use] +pub fn specs() -> Vec { + vec![ + SettingSpec::int( + "download.concurrency", + crate::download::config::DEFAULT_MAX_CONCURRENCY as i64, + (1, crate::download::config::MAX_CONCURRENCY as i64), + AiPolicy::silent(), + "同时下载的文件数(1~64,出厂 8)。这是引擎真实持有的并发许可,不是展示值;越界或手改坏值按出厂值生效", + ), + SettingSpec::int( + "download.retry_limit", + crate::download::config::DEFAULT_MAX_ATTEMPTS_PER_SOURCE as i64, + (0, crate::download::config::MAX_ATTEMPTS_PER_SOURCE as i64), + AiPolicy::silent(), + "单个下载源的最多尝试次数(含首次;出厂 3)。0 与 1 都等于「只试一次、不重试」——0 是旧版 GUI 提供过的档位,保留合法但不代表「不下载」。换源不受此限", + ), + SettingSpec::enumeration( + "download.region", + "auto", + REGIONS, + AiPolicy::audited(), + "下载地区判定:auto(时区+语言+探测)/ cn / global", + ), + SettingSpec::enumeration( + "download.mirror_preference", + "auto", + MIRROR_PREFERENCES, + AiPolicy::audited(), + "镜像偏好:auto(健康度评分)/ official(官方源优先)/ mirror(镜像优先)", + ), + ] +}