Option work
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
Julien Valverdé
2024-03-20 16:55:23 +01:00
parent 389bc696aa
commit f666eff496

View File

@@ -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<T extends Jsonifiable> = Opaque<T | null, "@thilawyn/zod-schema-class/JsonifiedEffectOption">
export type JsonifiedEffectOptionSome<T> = Opaque<T, "@thilawyn/zod-schema-class/JsonifiedEffectOptionSome">
export type JsonifiedEffectOptionNone = Opaque<null, "@thilawyn/zod-schema-class/JsonifiedEffectOptionNone">
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<InnerS>,
jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity,
) => schema
.transform(v => Option.getOrThrow(v))
.pipe(jsonifySchema(effectOptionSomeInnerSchema(schema)))
.transform<JsonifiedEffectOptionSome<z.output<JsonifiedInnerS>>>(identity),
none: <
InnerS extends z.ZodTypeAny,
JsonifiedInnerS extends z.ZodTypeAny = InnerS,
>(
schema: ZodEffectOptionNone<InnerS>,
_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<InnerS>,
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<InnerS>,
_jsonifySchema?: (schema: InnerS) => JsonifiedInnerS,
) =>
schema.transform(() => null),
} as const
export const dejsonifyOption = {
option: <
S extends ReturnType<typeof effect.option.option<T>>,
T extends z.ZodSchema,
>(
schema: S | ReturnType<typeof effect.option.option<T>>
) => z
.custom<JsonifiedEffectOption<T>>(identity)
.pipe(
z.
),
some: <
S extends ReturnType<typeof effect.option.some<T>>,
T extends z.ZodSchema,
>(
schema: S | ReturnType<typeof effect.option.some<T>>
) =>
(schema as S).transform(v => Option.getOrThrow(v)),
none: <
S extends ReturnType<typeof effect.option.none<T>>,
T extends z.ZodSchema | unknown = unknown,
>(
schema: S | ReturnType<typeof effect.option.none<T>>
) =>
(schema as S).transform(() => null),
z.null().pipe(schema),
} as const