import type { NamingKind, NamingOverride } from "@umt/contracts"; // 命名模板表单的纯函数:保存错误拆分、覆盖请求体、来源文案。 export const NAMING_KINDS: NamingKind[] = ["movie", "tv", "variety"]; export const SOURCE_LABEL = { global: "全局", root: "库根", entity: "作品" } as const; /** 422 消息 "movie: 1:3 …; tv: …" → 按类型拆开,行列号改写成中文 */ export function splitNamingErrors(message: string): Partial> | null { const out: Partial> = {}; for (const m of message.matchAll(/(movie|tv|variety):\s*([^;]+)/g)) { const [, k, msg] = m; const pos = /^(\d+):(\d+)\s*(.*)$/.exec((msg ?? "").trim()); out[k as NamingKind] = pos ? `第 ${pos[1]} 行第 ${pos[2]} 列:${pos[3]}` : (msg ?? "").trim(); } return Object.keys(out).length ? out : null; } /** 覆盖草稿 → 请求体;全部留空 = null(清除覆盖) */ export function overrideBody(draft: Partial>): NamingOverride | null { const o: NamingOverride = {}; for (const k of NAMING_KINDS) { const v = draft[k]; if (v?.trim()) o[k] = v; } return Object.keys(o).length ? o : null; }