diff --git a/packages/extension-form/src/internal/Form.ts b/packages/extension-form/src/internal/Form.ts index 1b8bed4..914aae1 100644 --- a/packages/extension-form/src/internal/Form.ts +++ b/packages/extension-form/src/internal/Form.ts @@ -1,26 +1,6 @@ import { Schema } from "effect" -import type * as FormField from "./FormField.js" export interface Form { readonly schema: Schema.Schema } - - -export type FormTree> = ( - S extends Schema.Array$ ? FormField.ArrayFormField : - S extends Schema.Struct ? FormField.StructFormField : - FormField.GenericFormField -) - - -const MySchema = Schema.Struct({ - name: Schema.String, - symbol: Schema.SymbolFromSelf, - values: Schema.Array(Schema.String), -}) - -type TestFormTree = FormTree -declare const testFormTree: TestFormTree - -testFormTree.fields.values.elements diff --git a/packages/extension-form/src/internal/FormField.ts b/packages/extension-form/src/internal/FormField.ts index a07df9d..673aaa5 100644 --- a/packages/extension-form/src/internal/FormField.ts +++ b/packages/extension-form/src/internal/FormField.ts @@ -1,25 +1,31 @@ import type { Schema } from "effect" -import type * as Form from "./Form.ts" +import type * as FormTree from "./FormTree.ts" export interface FormField { - + readonly schema: S } export interface GenericFormField extends FormField { readonly _tag: "GenericFormField" - readonly schema: S readonly value: S["Type"] } -export interface ArrayFormField> extends FormField { - readonly _tag: "ArrayFormField" - readonly schema: S - readonly elements: readonly Form.FormTree[] +export interface TupleFormField> extends FormField { + readonly _tag: "TupleFormField" + readonly elements: { readonly [K in keyof S["elements"]]: FormTree.FormTree } } -export interface StructFormField> extends FormField { - readonly _tag: "StructFormField" - readonly schema: S - readonly fields: { [K in keyof S["fields"]]: Form.FormTree } +export interface ArrayFormField> extends FormField { + readonly _tag: "ArrayFormField" + readonly elements: readonly FormTree.FormTree[] +} + +export interface StructFormField> extends FormField { + readonly _tag: "StructFormField" + readonly fields: { [K in keyof S["fields"]]: FormTree.FormTree } } diff --git a/packages/extension-form/src/internal/FormTree.ts b/packages/extension-form/src/internal/FormTree.ts new file mode 100644 index 0000000..f741222 --- /dev/null +++ b/packages/extension-form/src/internal/FormTree.ts @@ -0,0 +1,21 @@ +import { Schema } from "effect" +import type * as FormField from "./FormField.js" + + +export type FormTree> = ( + S extends Schema.Array$ ? FormField.ArrayFormField : + S extends Schema.Struct ? FormField.StructFormField : + FormField.GenericFormField +) + + +const MySchema = Schema.Struct({ + name: Schema.String, + symbol: Schema.SymbolFromSelf, + values: Schema.Array(Schema.String), +}) + +type TestFormTree = FormTree +declare const testFormTree: TestFormTree + +testFormTree.fields.values.elements