import type { z } from "zod/mini" import { ColorContentSchema, DateContentSchema, FieldContentType, NumberContentSchema, RangeContentSchema, SelectContentSchema, TextContentSchema, TimestampContentSchema, } from "../field" import type { ColorContent, DateContent, NumberContent, RangeContent, SelectContent, TextContent, TimestampContent, } from "../field" import type { StringLegacy } from "../legacy/field" import { StringLegacySchema } from "../legacy/field" import type { LegacyContentCtx, LegacyCodec } from "./legacyContentCtx" type LegacyFieldContent = | TextContent | ColorContent | DateContent | TimestampContent | NumberContent | RangeContent | SelectContent function createFieldLegacyCodec( ctx: LegacyContentCtx, name: string, type: TContent["type"], schema: z.ZodMiniType, ): LegacyCodec { return { name, is(input): input is TContent { return schema.safeParse(input).success }, toContent(input) { const parsed = StringLegacySchema.safeParse(input) if (!parsed.success) { return parsed } return { success: true, data: { __TYPE__: FieldContentType, type, value: parsed.data, } as TContent, } }, fromContent(input) { return { content: input.value, types: { [ctx.keyOfType]: type }, keys: {}, } }, } } export const TextLegacyCodec = (ctx: LegacyContentCtx): LegacyCodec => createFieldLegacyCodec(ctx, "TextLegacy", "Text", TextContentSchema) export const ColorLegacyCodec = (ctx: LegacyContentCtx): LegacyCodec => createFieldLegacyCodec(ctx, "ColorLegacy", "Color", ColorContentSchema) export const DateLegacyCodec = (ctx: LegacyContentCtx): LegacyCodec => createFieldLegacyCodec(ctx, "DateLegacy", "Date", DateContentSchema) export const TimestampLegacyCodec = ( ctx: LegacyContentCtx, ): LegacyCodec => createFieldLegacyCodec(ctx, "TimestampLegacy", "Timestamp", TimestampContentSchema) export const NumberLegacyCodec = ( ctx: LegacyContentCtx, ): LegacyCodec => createFieldLegacyCodec(ctx, "NumberLegacy", "Number", NumberContentSchema) export const RangeLegacyCodec = (ctx: LegacyContentCtx): LegacyCodec => createFieldLegacyCodec(ctx, "RangeLegacy", "Range", RangeContentSchema) export const SelectLegacyCodec = ( ctx: LegacyContentCtx, ): LegacyCodec => createFieldLegacyCodec(ctx, "SelectLegacy", "Select", SelectContentSchema)