refactor(setting): download 四键纯搬移到 setting/keys/download.rs(M292 1/2)

`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 处,与项数一一对应),所以它们不可能顺手改掉块内的真实差异。
This commit is contained in:
AskaEth committed 2026-11-13 03:20:00 +08:00
1 parent bba98d5898
commit f4b5a73594
2 files changed
+55 -30

No files matched your search

+49
View File
@@ -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<SettingSpec> {
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(镜像优先)",
),
]
}