import type { ResolvedToolcraftAppSchema, ToolcraftDecisionDiagnosticSeverity, ToolcraftDecisionRuleId, ToolcraftTimelineMode, } from "@repo/toolcraft-runtime"; import { getToolcraftDecisionDiagnosticSeverity } from "@repo/toolcraft-runtime"; import type { ToolcraftComponentAcceptance, ToolcraftControlSectionInventoryEntry, ToolcraftProductReadiness, ToolcraftTransferMode, ToolcraftVisibleControl, } from "./types"; export type ToolcraftAcceptanceValidationContext = { acceptance: readonly ToolcraftComponentAcceptance[]; controls: readonly ToolcraftVisibleControl[]; hasVideoExportAction: boolean; layersEnabled: boolean; productReadiness: ToolcraftProductReadiness; schema: ResolvedToolcraftAppSchema; sectionInventory: readonly ToolcraftControlSectionInventoryEntry[]; timelineMode: ToolcraftTimelineMode | null; transferMode: ToolcraftTransferMode; }; export type ToolcraftAcceptanceDiagnostic = { message: string; path: string; ruleId: ToolcraftDecisionRuleId; severity: ToolcraftDecisionDiagnosticSeverity; }; export type ToolcraftAcceptanceValidator = { path: string; ruleId: ToolcraftDecisionRuleId; validate(context: ToolcraftAcceptanceValidationContext): string[]; }; export function runToolcraftAcceptanceValidators( context: ToolcraftAcceptanceValidationContext, validators: readonly ToolcraftAcceptanceValidator[], ): ToolcraftAcceptanceDiagnostic[] { return validators.flatMap(({ path, ruleId, validate }) => validate(context).map((message) => ({ message, path, ruleId, severity: getToolcraftDecisionDiagnosticSeverity(ruleId), })), ); } export function getBlockingToolcraftAcceptanceMessages( diagnostics: readonly ToolcraftAcceptanceDiagnostic[], ): string[] { return diagnostics .filter(({ severity }) => severity === "error") .map(({ message }) => message); }