diff --git a/src/schema/jsonified/option.ts b/src/schema/jsonified/option.ts index bddc561..749562d 100644 --- a/src/schema/jsonified/option.ts +++ b/src/schema/jsonified/option.ts @@ -2,11 +2,12 @@ import { Option } from "effect" import { identity } from "lodash-es" import { Jsonifiable, Opaque } from "type-fest" import { z } from "zod" -import { effect } from "../effect" import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effectOptionNoneSchema, effectOptionSomeInnerSchema, effectOptionSomeSchema } from "../effect/option" export type JsonifiedEffectOption = Opaque +export type JsonifiedEffectOptionSome = Opaque +export type JsonifiedEffectOptionNone = Opaque export const jsonifyOption = { @@ -21,6 +22,39 @@ export const jsonifyOption = { jsonifyOption.none(effectOptionNoneSchema(schema), jsonifySchema), ]), + some: < + InnerS extends z.ZodTypeAny, + JsonifiedInnerS extends z.ZodTypeAny = InnerS, + >( + schema: ZodEffectOptionSome, + jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, + ) => schema + .transform(v => Option.getOrThrow(v)) + .pipe(jsonifySchema(effectOptionSomeInnerSchema(schema))) + .transform>>(identity), + + none: < + InnerS extends z.ZodTypeAny, + JsonifiedInnerS extends z.ZodTypeAny = InnerS, + >( + schema: ZodEffectOptionNone, + _jsonifySchema?: (schema: InnerS) => JsonifiedInnerS, + ) => + schema.transform(() => null as JsonifiedEffectOptionNone), +} as const + +export const dejsonifyOption = { + option: < + InnerS extends z.ZodTypeAny, + JsonifiedInnerS extends z.ZodTypeAny = InnerS, + >( + schema: ZodEffectOption, + jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, + ) => z.union([ + jsonifyOption.some(effectOptionSomeSchema(schema), jsonifySchema), + jsonifyOption.none(effectOptionNoneSchema(schema), jsonifySchema), + ]), + some: < InnerS extends z.ZodTypeAny, JsonifiedInnerS extends z.ZodTypeAny = InnerS, @@ -38,34 +72,5 @@ export const jsonifyOption = { schema: ZodEffectOptionNone, _jsonifySchema?: (schema: InnerS) => JsonifiedInnerS, ) => - schema.transform(() => null), -} as const - -export const dejsonifyOption = { - option: < - S extends ReturnType>, - T extends z.ZodSchema, - >( - schema: S | ReturnType> - ) => z - .custom>(identity) - .pipe( - z. - ), - - some: < - S extends ReturnType>, - T extends z.ZodSchema, - >( - schema: S | ReturnType> - ) => - (schema as S).transform(v => Option.getOrThrow(v)), - - none: < - S extends ReturnType>, - T extends z.ZodSchema | unknown = unknown, - >( - schema: S | ReturnType> - ) => - (schema as S).transform(() => null), + z.null().pipe(schema), } as const