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 {} 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 const jsonifiedBigIntOptionSome = jsonify.option.some( effect.option.some(z.bigint()), jsonifyBigIntSchema, ) type T2 = z.output const jsonifiedBigIntOptionNone = jsonify.option.none( effect.option.none(z.bigint()), jsonifyBigIntSchema, ) type T3 = z.output const dejsonifyBigInt = dejsonify.bigint(z.bigint()) type T4 = z.input // 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 {} // 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 {} const admin = AdminUser.create({ id: Option.some(2n), name: "Admin" })