import { z, objectUtil } from 'zod'; import { getParsersEngineDataBoxUnionSchema, type ParsersEngineDataBoxType, type PickParsersEngineDataBoxSchema, } from '../../parsersEngine/definitions/parsersEngineDataBox.js'; import type { ParserFunction } from '../../parsersEngine/definitions/ParserFunction.js'; import { type CommonBuiltInParserOptionsSchema, commonBuiltInParserOptionsSchema, optionalCommonBuiltInParserOptionsSchema, type OptionalCommonBuiltInParserOptionsSchema, } from './commonBuiltInParserOptions.js'; import { getParserOutputConfigurationUnionSchema, type ParserOutputConfigurationType, type PickParserOutputConfigurationSchema, } from './parserOutputConfiguration.js'; import type { BuiltInParserFunction } from './BuiltInParserFunction.js'; /* v8 ignore start */ export type BuiltInParserDefinitionSignature< Name extends string, Kind extends 'utility' | 'generation', HasOptionalOptions extends boolean, OptionsSchema extends z.ZodObject | undefined, HasOptionalOutput extends boolean, OutputTypes extends Array | undefined, InTypes extends Array, OutType extends ParsersEngineDataBoxType, > = { name: Name; nameSchema: z.ZodLiteral; kind: Kind; hasOptionalOptions: HasOptionalOptions; optionsSchema: OptionsSchema extends undefined ? OptionalCommonBuiltInParserOptionsSchema : HasOptionalOptions extends true ? z.ZodOptional< z.ZodObject< objectUtil.extendShape< NonNullable['shape'], CommonBuiltInParserOptionsSchema['shape'] >, 'strict' > > : z.ZodObject< objectUtil.extendShape< NonNullable['shape'], CommonBuiltInParserOptionsSchema['shape'] >, 'strict' >; hasOptionalOutput: HasOptionalOutput; outputTypes: OutputTypes extends [] ? undefined : OutputTypes; outputSchema: OutputTypes extends undefined ? z.ZodOptional : OutputTypes extends [] ? z.ZodOptional : OutputTypes extends Array ? HasOptionalOutput extends true ? z.ZodOptional]>>> : z.ZodUnion]>> : never; inTypes: InTypes; inSchema: InTypes extends [] ? never : InTypes extends Array ? z.ZodUnion]>> : never; outType: OutType; outSchema: PickParsersEngineDataBoxSchema; parserConfigurationSchema: z.ZodObject< { name: z.ZodLiteral; options: OptionsSchema extends undefined ? OptionalCommonBuiltInParserOptionsSchema : HasOptionalOptions extends true ? z.ZodOptional< z.ZodObject< objectUtil.extendShape< NonNullable['shape'], CommonBuiltInParserOptionsSchema['shape'] >, 'strict' > > : z.ZodObject< objectUtil.extendShape< NonNullable['shape'], CommonBuiltInParserOptionsSchema['shape'] >, 'strict' >; output: OutputTypes extends undefined ? z.ZodOptional : OutputTypes extends [] ? z.ZodOptional : OutputTypes extends Array ? HasOptionalOutput extends true ? z.ZodOptional]>>> : z.ZodUnion]>> : never; }, 'strict' >; }; export function createBuiltInParserDefinition< Name extends string, Kind extends 'generation' | 'utility', HasOptionalOptions extends boolean, OptionsSchema extends z.ZodObject | undefined, HasOptionalOutput extends boolean, OutputTypes extends | [ParserOutputConfigurationType, ...Array] | undefined, InTypes extends Array, OutType extends ParsersEngineDataBoxType, >(params: { name: Name; kind: Kind; hasOptionalOptions: HasOptionalOptions; optionsSchema: OptionsSchema; hasOptionalOutput: HasOptionalOutput; outputTypes: OutputTypes; inTypes: InTypes; outType: OutType; }): BuiltInParserDefinitionSignature< Name, Kind, HasOptionalOptions, OptionsSchema, HasOptionalOutput, OutputTypes, InTypes, OutType > { const nameSchema = z.literal(params.name); const optionsSchema = params.optionsSchema ? params.hasOptionalOptions ? params.optionsSchema.merge(commonBuiltInParserOptionsSchema).optional() : params.optionsSchema.merge(commonBuiltInParserOptionsSchema) : optionalCommonBuiltInParserOptionsSchema; const outputTypes = params.outputTypes && params.outputTypes.length === 0 ? undefined : params.outputTypes; const outputSchema = outputTypes === undefined ? z.undefined().optional() : params.hasOptionalOutput ? getParserOutputConfigurationUnionSchema(outputTypes).optional() : getParserOutputConfigurationUnionSchema(outputTypes); return { name: params.name, nameSchema, kind: params.kind, hasOptionalOptions: params.hasOptionalOptions, optionsSchema: optionsSchema as any, hasOptionalOutput: params.hasOptionalOutput, outputTypes: outputTypes as any, outputSchema, inTypes: params.inTypes, inSchema: getParsersEngineDataBoxUnionSchema(params.inTypes), outType: params.outType, outSchema: getParsersEngineDataBoxUnionSchema([params.outType]), parserConfigurationSchema: z .object({ name: nameSchema, options: optionsSchema, output: outputSchema, }) .strict() as any, } as any; } export type DeriveMakeParserFunctionFromDefinition< Def extends BuiltInParserDefinitionSignature, > = ( params: Def['hasOptionalOptions'] extends true ? Def['hasOptionalOutput'] extends true ? { options?: z.infer; output?: z.infer; } : { options?: z.infer; output: z.infer; } : Def['hasOptionalOutput'] extends true ? { options: z.infer; output?: z.infer; } : { options: z.infer; output: z.infer; }, ) => ParserFunction, z.infer>; export type DeriveBuiltInParserHandlerFromDefinition< Def extends BuiltInParserDefinitionSignature, > = BuiltInParserFunction< z.infer, z.infer, z.infer, z.infer >; export type DeriveParserOptionsFromDefinition< Def extends BuiltInParserDefinitionSignature, > = z.infer; /* v8 ignore stop */