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

This commit is contained in:
Julien Valverdé
2024-03-18 18:32:27 +01:00
parent 1fd74bb851
commit 27a8fc1c9b
3 changed files with 16 additions and 7 deletions

View File

@@ -1,12 +1,14 @@
import { dejsonifyBigIntSchema, jsonifyBigIntSchema } from "./bigint" import { dejsonifyBigIntSchema, jsonifyBigIntSchema } from "./bigint"
import { dejsonifyDateSchema, jsonifyDateSchema } from "./date" import { dejsonifyDateSchema, jsonifyDateSchema } from "./date"
import { dejsonifyDecimalSchema, jsonifyDecimalSchema } from "./decimal" import { dejsonifyDecimalSchema, jsonifyDecimalSchema } from "./decimal"
import { jsonifyOption } from "./option"
export const jsonify = { export const jsonify = {
bigint: jsonifyBigIntSchema, bigint: jsonifyBigIntSchema,
date: jsonifyDateSchema, date: jsonifyDateSchema,
decimal: jsonifyDecimalSchema, decimal: jsonifyDecimalSchema,
option: jsonifyOption,
} as const } as const
export const dejsonify = { export const dejsonify = {

View File

@@ -1,16 +1,19 @@
import { Option } from "effect" import { Option } from "effect"
import { identity } from "lodash-es"
import { z } from "zod" import { z } from "zod"
import { effect } from "../effect"
export const jsonifyOption = { export const jsonifyOption = {
option: <S extends z.ZodSchema>(schema: S) => // option: <S extends z.ZodSchema>(schema: S) =>
z.union([option.some(schema), option.none(schema)]), // z.union([option.some(schema), option.none(schema)]),
some: <S extends z.ZodSchema>(schema: S) => z some: <
.custom<Option.Some<z.output<S>>>(v => Option.isOption(v) && Option.isSome(v), "Not an Option") S extends ReturnType<typeof effect.option.some<T>>,
.pipe(z.object({ value: schema }).passthrough()) T extends z.ZodSchema,
.transform<Option.Some<z.output<S>>>(identity), >(
schema: S | ReturnType<typeof effect.option.some<T>>
) =>
(schema as S).transform(v => Option.getOrThrow(v)),
none: <S extends z.ZodSchema | unknown = unknown>(_schema?: S) => none: <S extends z.ZodSchema | unknown = unknown>(_schema?: S) =>
z.custom<Option.None< z.custom<Option.None<

View File

@@ -30,6 +30,10 @@ const userInst = User.create({ id: Option.some(1n), name: "User" })
const userInstEffect = User.createEffect({ id: Option.some(1n), name: "User" }) const userInstEffect = User.createEffect({ id: Option.some(1n), name: "User" })
const jsonifiedOption = jsonify.option.some(
effect.option.some(z.literal("prout"))
).parse({})
const jsonifiedUserExp = JsonifiedZodSchemaClass(User, { const jsonifiedUserExp = JsonifiedZodSchemaClass(User, {
jsonifySchema: s => s.extend({ jsonifySchema: s => s.extend({
id: jsonify.bigint(s.shape.id) id: jsonify.bigint(s.shape.id)