import { z } from "zod"; import { REVIEW_SCALAR_UNIT_MAP_CONTRACT_VERSION, REVIEW_SCALAR_UNIT_MAP_LIMITS, isDiagnosticToken } from "@actuarial-ts/core"; import { quantitySemanticsSchema } from "./reviewContracts.js"; export const reviewScalarUnitMapSchema = z.object({ contractVersion: z.literal(REVIEW_SCALAR_UNIT_MAP_CONTRACT_VERSION), entries: z.array(z.object({ path: z.array(z.union([z.string().refine(isDiagnosticToken), z.object({ kind: z.literal("array-index") }).strict()])).min(1).max(REVIEW_SCALAR_UNIT_MAP_LIMITS.maximumPathSegments), quantity: quantitySemanticsSchema, unit: z.string().refine(isDiagnosticToken), }).strict()).max(REVIEW_SCALAR_UNIT_MAP_LIMITS.maximumEntries), }).strict().superRefine((value, context) => { const paths = new Set(); value.entries.forEach((entry, index) => { const key = JSON.stringify(entry.path); if (paths.has(key)) context.addIssue({ code: z.ZodIssueCode.custom, path: ["entries", index, "path"], message: "Native unit families must be unique" }); paths.add(key); }); });