From 440ad80bc33ff6b2bcd1575ba3a813865dc8ee4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Fri, 22 Mar 2024 13:39:13 +0100 Subject: [PATCH] Option module --- src/schema/effect/index.ts | 16 ++---- src/schema/effect/jsonifiedOption.ts | 77 ---------------------------- src/schema/effect/option.ts | 75 +++++++++++++++++++-------- 3 files changed, 58 insertions(+), 110 deletions(-) delete mode 100644 src/schema/effect/jsonifiedOption.ts diff --git a/src/schema/effect/index.ts b/src/schema/effect/index.ts index 38ea322..bc47e44 100644 --- a/src/schema/effect/index.ts +++ b/src/schema/effect/index.ts @@ -1,14 +1,6 @@ -import { dejsonifyOption, jsonifyOption } from "./jsonifiedOption" -import { option } from "./option" +import { option as optionModule } from "./option" -export const effect = { - option, - - jsonify: { - option: jsonifyOption - } as const, - dejsonify: { - option: dejsonifyOption - } as const, -} as const +export module effect { + export const option = optionModule +} diff --git a/src/schema/effect/jsonifiedOption.ts b/src/schema/effect/jsonifiedOption.ts deleted file mode 100644 index e693878..0000000 --- a/src/schema/effect/jsonifiedOption.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { Option } from "effect" -import { identity } from "lodash-es" -import { z } from "zod" -import { ZodEffectOption, ZodEffectOptionNone, ZodEffectOptionSome, effectOptionNoneSchema, effectOptionSomeInnerSchema, effectOptionSomeSchema } from "./option" - - -export type JsonifiedEffectOptionSomeBrand = "@thilawyn/zod-schema-class/JsonifiedEffectOptionSome" - - -export const jsonifyOption = { - 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, - >( - schema: ZodEffectOptionSome, - jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, - ) => schema - .transform(v => Option.getOrThrow(v)) - .pipe(jsonifySchema(effectOptionSomeInnerSchema(schema))) - .brand(), - - none: < - InnerS extends z.ZodTypeAny, - JsonifiedInnerS extends z.ZodTypeAny = InnerS, - >( - schema: ZodEffectOptionNone, - _jsonifySchema?: (schema: InnerS) => JsonifiedInnerS, - ) => - schema.transform(() => null), -} as const - -export const dejsonifyOption = { - option: < - InnerS extends z.ZodTypeAny, - DejsonifiedInnerS extends z.ZodTypeAny = InnerS, - >( - schema: ZodEffectOption, - dejsonifySchema: (schema: InnerS) => DejsonifiedInnerS = identity, - ) => z.union([ - dejsonifyOption.some(effectOptionSomeSchema(schema), dejsonifySchema), - dejsonifyOption.none(effectOptionNoneSchema(schema), dejsonifySchema), - ]), - - some: < - InnerS extends z.ZodTypeAny, - DejsonifiedInnerS extends z.ZodTypeAny = InnerS, - >( - schema: ZodEffectOptionSome, - dejsonifySchema: (schema: InnerS) => DejsonifiedInnerS = identity, - ) => z - .custom & z.BRAND>() - .pipe(dejsonifySchema(effectOptionSomeInnerSchema(schema))) - .transform(v => Option.some>(v)) - .pipe(schema), - - none: < - InnerS extends z.ZodTypeAny, - DejsonifiedInnerS extends z.ZodTypeAny = InnerS, - >( - schema: ZodEffectOptionNone, - _dejsonifySchema?: (schema: InnerS) => DejsonifiedInnerS, - ) => z - .null() - .transform(() => Option.none>()) - .pipe(schema), -} as const diff --git a/src/schema/effect/option.ts b/src/schema/effect/option.ts index 56163f9..30e3fd2 100644 --- a/src/schema/effect/option.ts +++ b/src/schema/effect/option.ts @@ -6,11 +6,48 @@ import { z } from "zod" type JsonifiedEffectOptionSomeBrand = "@thilawyn/zod-schema-class/JsonifiedEffectOptionSome" -export function option(schema: S) { +export function option(schema: InnerS) { return z.union([option.some(schema), option.none(schema)]) } export module option { + export type Option = ReturnType> + + function getSomeSchema(schema: Option): some.Some { + return schema.options[0] + } + function getNoneSchema(schema: Option): none.None { + return schema.options[1] + } + + + export function jsonify< + InnerS extends z.ZodTypeAny, + JsonifiedInnerS extends z.ZodTypeAny = InnerS, + >( + schema: Option, + jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, + ) { + return z.union([ + some.jsonify(getSomeSchema(schema), jsonifySchema), + none.jsonify(getNoneSchema(schema), jsonifySchema), + ]) + } + + export function dejsonify< + InnerS extends z.ZodTypeAny, + DejsonifiedInnerS extends z.ZodTypeAny = InnerS, + >( + schema: Option, + dejsonifySchema: (schema: InnerS) => DejsonifiedInnerS = identity, + ) { + return z.union([ + some.dejsonify(getSomeSchema(schema), dejsonifySchema), + none.dejsonify(getNoneSchema(schema), dejsonifySchema), + ]) + } + + export function some< InnerS extends z.ZodTypeAny >( @@ -23,16 +60,23 @@ export module option { } export module some { + export type Some = ReturnType> + + function getInnerSchema(schema: Some): InnerS { + return schema._def.schema._def.out.shape.value + } + + export function jsonify< InnerS extends z.ZodTypeAny, JsonifiedInnerS extends z.ZodTypeAny = InnerS, >( - schema: ZodEffectOptionSome, + schema: Some, jsonifySchema: (schema: InnerS) => JsonifiedInnerS = identity, ) { return schema .transform(v => Option.getOrThrow(v)) - .pipe(jsonifySchema(effectOptionSomeInnerSchema(schema))) + .pipe(jsonifySchema(getInnerSchema(schema))) .brand() } @@ -40,12 +84,12 @@ export module option { InnerS extends z.ZodTypeAny, DejsonifiedInnerS extends z.ZodTypeAny = InnerS, >( - schema: ZodEffectOptionSome, + schema: Some, dejsonifySchema: (schema: InnerS) => DejsonifiedInnerS = identity, ) { return z .custom & z.BRAND>() - .pipe(dejsonifySchema(effectOptionSomeInnerSchema(schema))) + .pipe(dejsonifySchema(getInnerSchema(schema))) .transform(v => Option.some>(v)) .pipe(schema) } @@ -67,11 +111,14 @@ export module option { } export module none { + export type None = ReturnType> + + export function jsonify< InnerS extends z.ZodTypeAny, JsonifiedInnerS extends z.ZodTypeAny = InnerS, >( - schema: ZodEffectOptionNone, + schema: None, _jsonifySchema?: (schema: InnerS) => JsonifiedInnerS, ) { return schema.transform(() => null) @@ -81,7 +128,7 @@ export module option { InnerS extends z.ZodTypeAny, DejsonifiedInnerS extends z.ZodTypeAny = InnerS, >( - schema: ZodEffectOptionNone, + schema: None, _dejsonifySchema?: (schema: InnerS) => DejsonifiedInnerS, ) { return z @@ -91,17 +138,3 @@ export module option { } } } - - -export type ZodEffectOption = ReturnType> -export type ZodEffectOptionSome = ReturnType> -export type ZodEffectOptionNone = ReturnType> - -export const effectOptionSomeSchema = (schema: ZodEffectOption): ZodEffectOptionSome => - schema.options[0] - -export const effectOptionNoneSchema = (schema: ZodEffectOption): ZodEffectOptionNone => - schema.options[1] - -export const effectOptionSomeInnerSchema = (schema: ZodEffectOptionSome): S => - schema._def.schema._def.out.shape.value