From 9800477c7cfd3744f6c836a1fc575cad4b770f65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Tue, 22 Sep 2026 16:03:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E7=89=88=E6=9C=AC=E6=B8=85?= =?UTF-8?q?=E5=8D=95=E4=BB=8E=E5=A3=B0=E6=98=8E=E8=A1=A8=E6=B4=BE=E7=94=9F?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E6=BC=8F=E5=8A=A0=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=20-=20Model3dModelVersion=20=E7=9A=84=E5=8F=98=E4=BD=93?= =?UTF-8?q?=E3=80=81=E7=BA=BF=E4=B8=8A=E5=80=BC=E4=B8=8E=20ALL=20=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E7=94=B1=20model3d=5Fmodel=5Fversions!=20=E5=8D=95?= =?UTF-8?q?=E4=B8=80=E5=A3=B0=E6=98=8E=E8=A1=A8=E7=94=9F=E6=88=90=20-=20AL?= =?UTF-8?q?L=20=E7=B1=BB=E5=9E=8B=E6=94=B9=E4=B8=BA=20&'static=20[Self]?= =?UTF-8?q?=EF=BC=8C=E6=96=B0=E5=A2=9E=E7=89=88=E6=9C=AC=E5=8F=AA=E9=9C=80?= =?UTF-8?q?=E5=9C=A8=E5=A3=B0=E6=98=8E=E8=A1=A8=E5=8A=A0=E4=B8=80=E8=A1=8C?= =?UTF-8?q?=20-=20=E5=AE=9A=E4=BB=B7=E6=A0=A1=E9=AA=8C=E4=B8=8E=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=9A=84=E9=81=8D=E5=8E=86=E6=94=B9=E7=94=A8=20iter()?= =?UTF-8?q?.copied()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../crates/api-server/src/tripo3d/pricing.rs | 5 ++- .../src/model3d/common/model_version.rs | 42 ++++++++++++------- 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/server-rs/crates/api-server/src/tripo3d/pricing.rs b/server-rs/crates/api-server/src/tripo3d/pricing.rs index e3c808074..547e75708 100644 --- a/server-rs/crates/api-server/src/tripo3d/pricing.rs +++ b/server-rs/crates/api-server/src/tripo3d/pricing.rs @@ -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::ALL - .into_iter() + .iter() + .copied() .map(|version| { ( version, diff --git a/server-rs/crates/shared-contracts/src/model3d/common/model_version.rs b/server-rs/crates/shared-contracts/src/model3d/common/model_version.rs index 0dc1255df..3e99f704e 100644 --- a/server-rs/crates/shared-contracts/src/model3d/common/model_version.rs +++ b/server-rs/crates/shared-contracts/src/model3d/common/model_version.rs @@ -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", }