83 lines
2.4 KiB
TypeScript
83 lines
2.4 KiB
TypeScript
import { Implements } from "@thilawyn/traitify-ts"
|
|
import { Option } from "effect"
|
|
import { z } from "zod"
|
|
import { ZodSchemaClass } from "./ZodSchemaClass"
|
|
import { dejsonify, jsonify } from "./schema/jsonified"
|
|
import { jsonifyBigIntSchema } from "./schema/jsonified/bigint"
|
|
import { effect } from "./schema/lib"
|
|
import { MobXObservableZodSchemaObject } from "./traits/MobXObservableZodSchemaObject"
|
|
|
|
|
|
const userExp = ZodSchemaClass(
|
|
z.object({
|
|
/** User ID */
|
|
id: effect.option.option(z.bigint()).default(Option.none()),
|
|
|
|
/** Username */
|
|
name: z.string(),
|
|
|
|
/** Role */
|
|
role: z.enum(["User", "Moderator", "Admin"]).default("User"),
|
|
})
|
|
)
|
|
.expresses(MobXObservableZodSchemaObject)
|
|
.build()
|
|
|
|
@userExp.staticImplements
|
|
class User extends userExp.extends implements Implements<typeof userExp> {}
|
|
|
|
const userInst = User.create({ id: Option.some(1n), name: "User" })
|
|
const userInstEffect = User.createEffect({ id: Option.some(1n), name: "User" })
|
|
|
|
|
|
const jsonifiedBigIntOption = jsonify.option.option(
|
|
effect.option.option(z.bigint()),
|
|
jsonifyBigIntSchema,
|
|
)
|
|
type T1 = z.output<typeof jsonifiedBigIntOption>
|
|
|
|
|
|
const jsonifiedBigIntOptionSome = jsonify.option.some(
|
|
effect.option.some(z.bigint()),
|
|
jsonifyBigIntSchema,
|
|
)
|
|
type T2 = z.output<typeof jsonifiedBigIntOptionSome>
|
|
|
|
const jsonifiedBigIntOptionNone = jsonify.option.none(
|
|
effect.option.none(z.bigint()),
|
|
jsonifyBigIntSchema,
|
|
)
|
|
type T3 = z.output<typeof jsonifiedBigIntOptionNone>
|
|
|
|
|
|
const dejsonifyBigInt = dejsonify.bigint(z.bigint())
|
|
type T4 = z.input<typeof dejsonifyBigInt>
|
|
|
|
|
|
// const jsonifiedUserExp = JsonifiedZodSchemaClass(User, {
|
|
// jsonifySchema: s => s.extend({
|
|
// id: jsonify.bigint(s.shape.id)
|
|
// }),
|
|
|
|
// dejsonifySchema: s => s.extend({
|
|
// id: dejsonify.bigint(s.shape.id)
|
|
// }),
|
|
// }).build()
|
|
|
|
// @jsonifiedUserExp.staticImplements
|
|
// class JsonifiedUser extends jsonifiedUserExp.extends implements Implements<typeof jsonifiedUserExp> {}
|
|
|
|
// const jsonifiedUserInst = JsonifiedUser.jsonify(userInst)
|
|
// console.log(JSON.stringify(jsonifiedUserInst))
|
|
// jsonifiedUserInst.dejsonify()
|
|
|
|
|
|
const adminUserExp = User.extend(s => s.extend({
|
|
role: z.literal("Admin").default("Admin")
|
|
})).build()
|
|
|
|
@adminUserExp.staticImplements
|
|
class AdminUser extends adminUserExp.extends implements Implements<typeof adminUserExp> {}
|
|
|
|
const admin = AdminUser.create({ id: Option.some(2n), name: "Admin" })
|