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", }