48 lines
1.5 KiB
TypeScript
48 lines
1.5 KiB
TypeScript
import { Effect, pipe } from "effect"
|
|
import { z } from "zod"
|
|
import { JsonifiableSchemableClass, JsonifiableSchemableConfig } from "."
|
|
import { parseZodTypeEffect } from "../util"
|
|
|
|
|
|
export const dejsonifySchemable = <
|
|
C extends JsonifiableSchemableClass<$Config>,
|
|
$Config extends JsonifiableSchemableConfig,
|
|
>(
|
|
class_: C | JsonifiableSchemableClass<$Config>,
|
|
values: $Config["jsonifiedValues"],
|
|
params?: Partial<z.ParseParams>,
|
|
) =>
|
|
new class_(class_.dejsonifySchema.parse(values, params)) as InstanceType<C>
|
|
|
|
|
|
export const dejsonifySchemablePromise = async <
|
|
C extends JsonifiableSchemableClass<$Config>,
|
|
$Config extends JsonifiableSchemableConfig,
|
|
>(
|
|
class_: C | JsonifiableSchemableClass<$Config>,
|
|
values: $Config["jsonifiedValues"],
|
|
params?: Partial<z.ParseParams>,
|
|
) =>
|
|
new class_(await class_.dejsonifySchema.parseAsync(values, params)) as InstanceType<C>
|
|
|
|
|
|
export const dejsonifySchemableEffect = <
|
|
C extends JsonifiableSchemableClass<$Config>,
|
|
$Config extends JsonifiableSchemableConfig,
|
|
>(
|
|
class_: C | JsonifiableSchemableClass<$Config>,
|
|
values: $Config["jsonifiedValues"],
|
|
params?: Partial<z.ParseParams>,
|
|
) => pipe(
|
|
parseZodTypeEffect<
|
|
z.output<typeof class_.dejsonifySchema>,
|
|
z.input<typeof class_.dejsonifySchema>
|
|
>(
|
|
class_.dejsonifySchema,
|
|
values,
|
|
params,
|
|
),
|
|
|
|
Effect.map(values => new class_(values) as InstanceType<C>),
|
|
)
|