From 69ce232a746ffe9176d9ebfb9abb17c55f3703c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Sat, 12 Sep 2026 10:20:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BA=E7=BB=91=E5=AE=9A=E5=8C=BA=E5=9F=9F?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E5=BC=95=E5=85=A5=E7=B1=BB=E5=9E=8B=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用 ZeroDimension 和 OutOfBounds 区分边界校验失败 补充 typed error 单元测试并保留展示层中文文案 --- .../commands/separation/model/binding.rs | 53 +++++++++++++++++-- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/apps/ai-game-creator-shell/src-tauri/src/ui_editor/commands/separation/model/binding.rs b/apps/ai-game-creator-shell/src-tauri/src/ui_editor/commands/separation/model/binding.rs index d24f249eb..e527c7613 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/ui_editor/commands/separation/model/binding.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/ui_editor/commands/separation/model/binding.rs @@ -2,6 +2,23 @@ use crate::ui_editor::utils::NodeId; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum BindingAreaValidationError { + ZeroDimension, + OutOfBounds, +} + +impl std::fmt::Display for BindingAreaValidationError { + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str(match self { + Self::ZeroDimension => "BindingArea 宽度和高度必须大于 0", + Self::OutOfBounds => "BindingArea 超出处理图边界", + }) + } +} + +impl std::error::Error for BindingAreaValidationError {} + #[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize, JsonSchema)] #[schemars(deny_unknown_fields)] pub struct BindingArea { @@ -12,9 +29,9 @@ pub struct BindingArea { } impl BindingArea { - pub fn validate_in(&self, w: u32, h: u32) -> Result<(), String> { + pub fn validate_in(&self, w: u32, h: u32) -> Result<(), BindingAreaValidationError> { if self.width_px == 0 || self.height_px == 0 { - return Err("BindingArea 宽度和高度必须大于 0".into()); + return Err(BindingAreaValidationError::ZeroDimension); } if self .global_pos_x_px @@ -25,7 +42,7 @@ impl BindingArea { .checked_add(self.height_px) .is_none_or(|v| v > h) { - return Err("BindingArea 超出处理图边界".into()); + return Err(BindingAreaValidationError::OutOfBounds); } Ok(()) } @@ -48,3 +65,33 @@ pub enum BindingDecision { pub struct BindingResp { pub decisions: Vec, } + +#[cfg(test)] +mod tests { + use super::{BindingArea, BindingAreaValidationError}; + + #[test] + fn validates_binding_area_with_typed_errors() { + let zero = BindingArea { + global_pos_x_px: 0, + global_pos_y_px: 0, + width_px: 0, + height_px: 1, + }; + assert_eq!( + zero.validate_in(10, 10), + Err(BindingAreaValidationError::ZeroDimension) + ); + + let outside = BindingArea { + global_pos_x_px: 10, + global_pos_y_px: 0, + width_px: 1, + height_px: 1, + }; + assert_eq!( + outside.validate_in(10, 10), + Err(BindingAreaValidationError::OutOfBounds) + ); + } +}