From 1b2b68fbae25546bed57ac43234d4c6874fa7e09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Thu, 17 Apr 2025 04:59:43 +0200 Subject: [PATCH] Form work --- .../extension-form/src/internal/FormField.ts | 34 +++++++++++++++- .../extension-form/src/internal/FormTree.ts | 39 ++++++++++++++++++- 2 files changed, 71 insertions(+), 2 deletions(-) diff --git a/packages/extension-form/src/internal/FormField.ts b/packages/extension-form/src/internal/FormField.ts index b9320f0..afdfe4e 100644 --- a/packages/extension-form/src/internal/FormField.ts +++ b/packages/extension-form/src/internal/FormField.ts @@ -1,4 +1,4 @@ -import type { Schema } from "effect" +import type { Array, Schema, SchemaAST } from "effect" import type * as FormTree from "./FormTree.ts" @@ -35,3 +35,35 @@ export interface StructFormField< readonly _tag: "StructFormField" readonly fields: { readonly [K in keyof Fields]: FormTree.FormTree } } + +export interface LiteralFormField< + S extends Schema.Literal, + Literals extends Array.NonEmptyReadonlyArray, +> extends FormField { + readonly _tag: "LiteralFormField" + readonly value: S["Type"] +} + +export interface UnionFormField< + S extends Schema.Union, + Members extends ReadonlyArray, +> extends FormField { + readonly _tag: "UnionFormField" + readonly member: FormTree.FormTree +} + + +export interface PropertySignatureFormField< + S extends Schema.PropertySignature, + TypeToken extends Schema.PropertySignature.Token, + Type, + Key extends PropertyKey, + EncodedToken extends Schema.PropertySignature.Token, + Encoded, + HasDefault extends boolean = false, + R = never, +> { + readonly _tag: "PropertySignatureFormField" + readonly propertySignature: S + readonly value: Type +} diff --git a/packages/extension-form/src/internal/FormTree.ts b/packages/extension-form/src/internal/FormTree.ts index ec7f4ef..6c17c95 100644 --- a/packages/extension-form/src/internal/FormTree.ts +++ b/packages/extension-form/src/internal/FormTree.ts @@ -6,12 +6,48 @@ export type FormTree = ( S extends Schema.TupleType ? FormField.TupleFormField : S extends Schema.Array$ ? FormField.ArrayFormField : S extends Schema.Struct ? FormField.StructFormField : + S extends Schema.Literal ? FormField.LiteralFormField : + S extends Schema.Union ? FormField.UnionFormField : S extends Schema.Schema.Any ? FormField.GenericFormField : + S extends Schema.PropertySignature< + infer TypeToken, + infer Type, + infer Key, + infer EncodedToken, + infer Encoded, + infer HasDefault, + infer R + > ? FormField.PropertySignatureFormField : never ) +const LoginForm = Schema.Union( + Schema.Struct({ + _tag: Schema.tag("ByEmail"), + email: Schema.String, + password: Schema.RedactedFromSelf(Schema.String), + }), + + Schema.Struct({ + _tag: Schema.tag("ByPhone"), + phone: Schema.String, + password: Schema.RedactedFromSelf(Schema.String), + }), +) +type LoginFormTree = FormTree +declare const loginFormTree: LoginFormTree + +switch (loginFormTree.member.fields._tag.value) { + case "ByEmail": + break + case "ByPhone": + break +} + + const User = Schema.Struct({ + _tag: Schema.tag("User"), name: Schema.String, roles: Schema.Tuple(Schema.Literal("Admin"), Schema.Literal("Moderator"), Schema.Literal("User")), values: Schema.Array(Schema.String), @@ -20,4 +56,5 @@ const User = Schema.Struct({ type TestFormTree = FormTree declare const testFormTree: TestFormTree -testFormTree.fields.roles.elements +testFormTree.fields._tag +testFormTree.fields.roles.elements[0].value