"""动作类型统一入口,新增操作时在这里显式加入联合类型""" from typing import Annotated, Self from pydantic import Field, TypeAdapter, model_validator from .add import AddAction from .base import ActionModel, BaseAction from .delete import DeleteAction from .move import MoveAction from .resize import ResizeAction from .update import UpdateAction from .update_canvas import UpdateCanvasAction # 按 type 选择对应模型,不维护重复的操作名称映射 Action = Annotated[ AddAction | DeleteAction | MoveAction | ResizeAction | UpdateAction | UpdateCanvasAction, Field(discriminator="type"), ] action_adapter = TypeAdapter(Action) class ActionBatch(ActionModel): actions: list[Action] = Field(description="按数组顺序执行的动作列表,允许为空") unsupported_reason: str | None = Field( default=None, description="需求中有任何部分无法用现有动作或查到的字段完成时,说明缺少什么能力,此时 actions 为空;能完成时为 null", ) @model_validator(mode="after") def unsupported_has_no_actions(self) -> Self: if self.unsupported_reason and self.actions: raise ValueError("填写 unsupported_reason 时 actions 必须为空,不能只执行需求的一部分") return self __all__ = [ "Action", "ActionBatch", "AddAction", "BaseAction", "DeleteAction", "MoveAction", "ResizeAction", "UpdateAction", "UpdateCanvasAction", "action_adapter", ]