diff --git a/packages/extension-form/src/internal/FormField.ts b/packages/extension-form/src/internal/FormField.ts index 673aaa5..21447a0 100644 --- a/packages/extension-form/src/internal/FormField.ts +++ b/packages/extension-form/src/internal/FormField.ts @@ -13,7 +13,13 @@ export interface GenericFormField extends FormField export interface TupleFormField> extends FormField { readonly _tag: "TupleFormField" - readonly elements: { readonly [K in keyof S["elements"]]: FormTree.FormTree } + readonly elements: { [K in keyof S]: FormTree.FormTree } +} + +export interface Tuple2FormField> extends FormField { + readonly _tag: "Tuple2FormField" + // readonly elements: readonly [FormTree.FormTree, FormTree.FormTree] + readonly elements: [...{ [K in keyof S["elements"]]: S["elements"][K] }] } export interface ArrayFormField> extends FormField { diff --git a/packages/extension-form/src/internal/FormTree.ts b/packages/extension-form/src/internal/FormTree.ts index f741222..9178055 100644 --- a/packages/extension-form/src/internal/FormTree.ts +++ b/packages/extension-form/src/internal/FormTree.ts @@ -2,20 +2,21 @@ import { Schema } from "effect" import type * as FormField from "./FormField.js" -export type FormTree> = ( +export type FormTree = ( + S extends Schema.Tuple ? FormField.TupleFormField : S extends Schema.Array$ ? FormField.ArrayFormField : S extends Schema.Struct ? FormField.StructFormField : FormField.GenericFormField ) -const MySchema = Schema.Struct({ +const User = Schema.Struct({ name: Schema.String, - symbol: Schema.SymbolFromSelf, + roles: Schema.Tuple(Schema.Literal("Admin"), Schema.Literal("Moderator"), Schema.Literal("User")), values: Schema.Array(Schema.String), }) -type TestFormTree = FormTree +type TestFormTree = FormTree declare const testFormTree: TestFormTree -testFormTree.fields.values.elements +testFormTree.fields.roles.elements