Files
zod-schema-class/src/schema/effect/option.ts
Julien Valverdé 4ac60d3b18
Some checks failed
continuous-integration/drone/push Build is failing
Schema work
2024-03-19 20:20:41 +01:00

26 lines
1.0 KiB
TypeScript

import { Option } from "effect"
import { identity } from "lodash-es"
import { z } from "zod"
export const option = {
option: <S extends z.ZodTypeAny>(schema: S) =>
z.union([option.some(schema), option.none(schema)]),
some: <S extends z.ZodTypeAny>(schema: S) => z
.custom<Option.Some<z.output<S>>>(v => Option.isOption(v) && Option.isSome(v), "Not an Option")
.pipe(z.object({ value: schema }).passthrough())
.transform<Option.Some<z.output<S>>>(identity),
none: <S extends z.ZodTypeAny | unknown = unknown>(_schema?: S) =>
z.custom<Option.None<
S extends z.ZodTypeAny
? z.output<S>
: unknown
>>(v => Option.isOption(v) && Option.isNone(v), "Not an Option"),
} as const
export type ZodEffectOption<S extends z.ZodTypeAny> = ReturnType<typeof option.option<S>>
export type ZodEffectOptionSome<S extends z.ZodTypeAny> = ReturnType<typeof option.some<S>>
export type ZodEffectOptionNone<S extends z.ZodTypeAny> = ReturnType<typeof option.none<S>>