模型版本清单从声明表派生避免漏加新版本

- Model3dModelVersion 的变体、线上值与 ALL 改为由 model3d_model_versions! 单一声明表生成
- ALL 类型改为 &'static [Self],新增版本只需在声明表加一行
- 定价校验与测试的遍历改用 iter().copied()
This commit is contained in:
2026-09-22 16:03:55 +08:00
parent 2e9aed3750
commit 9800477c7c
2 changed files with 29 additions and 18 deletions
@@ -178,7 +178,7 @@ impl Model3dPricingConfig {
.base_prices
.get(&endpoint)
.ok_or_else(|| format!("缺少 endpoint {} 的底价表", endpoint.as_str()))?;
for model_version in Model3dModelVersion::ALL {
for model_version in Model3dModelVersion::ALL.iter().copied() {
if !prices.contains_key(&model_version) {
return Err(format!(
"缺少 endpoint {} 模型 {} 的底价",
@@ -255,7 +255,8 @@ mod tests {
texture: u32,
) -> BTreeMap<Model3dModelVersion, Model3dBasePrice> {
Model3dModelVersion::ALL
.into_iter()
.iter()
.copied()
.map(|version| {
(
version,
@@ -2,22 +2,32 @@ use serde::{Deserialize, Serialize};
use super::MODEL3D_TS_EXPORT_DIR;
#[derive(Clone, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize, ts_rs::TS)]
#[ts(export, export_to = MODEL3D_TS_EXPORT_DIR)]
pub enum Model3dModelVersion {
#[serde(rename = "v3.1-20260211")]
H31,
#[serde(rename = "v3.0-20250812")]
H30,
#[serde(rename = "v2.5-20250123")]
H25,
#[serde(rename = "P1-20260311")]
P1,
#[serde(rename = "P2-20260801")]
P2,
/// 3D 模型版本的**唯一**声明表:枚举变体、线上值(serde rename)、ts-rs 绑定与 `ALL`
/// 全部由下面这张表派生,新增版本只需在表里加一行。
macro_rules! model3d_model_versions {
($($variant:ident => $wire:literal),+ $(,)?) => {
#[derive(
Clone, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize, ts_rs::TS,
)]
#[ts(export, export_to = MODEL3D_TS_EXPORT_DIR)]
pub enum Model3dModelVersion {
$(
#[serde(rename = $wire)]
$variant,
)+
}
impl Model3dModelVersion {
/// 契约支持的全部模型版本(按声明顺序);定价配置必须为每个版本给出两个端点的底价。
pub const ALL: &'static [Self] = &[$(Self::$variant,)+];
}
};
}
impl Model3dModelVersion {
/// 契约支持的全部模型版本;定价配置必须为每个版本给出两个端点的底价。
pub const ALL: [Self; 5] = [Self::H31, Self::H30, Self::H25, Self::P1, Self::P2];
model3d_model_versions! {
H31 => "v3.1-20260211",
H30 => "v3.0-20250812",
H25 => "v2.5-20250123",
P1 => "P1-20260311",
P2 => "P2-20260801",
}