diff --git a/packages/extension-form/src/internal/Form.ts b/packages/extension-form/src/internal/Form.ts index 209ac4f..ad621d8 100644 --- a/packages/extension-form/src/internal/Form.ts +++ b/packages/extension-form/src/internal/Form.ts @@ -1,6 +1,46 @@ -import type { Schema } from "effect" +import { Schema, SubscriptionRef } from "effect" export interface Form { readonly schema: Schema.Schema } + + +export type FormTree> = ( + S extends Schema.Struct ? StructFormField : + S extends ScalarSchema ? ScalarFormField : + S["Type"] +) + + +export interface FormField> { + readonly value: SubscriptionRef.SubscriptionRef +} + +export interface ScalarFormField extends FormField { + readonly _tag: "ScalarFormField" + readonly schema: S +} + +export interface StructFormField> extends FormField { + readonly _tag: "StructFormField" + readonly schema: S + readonly fields: { [K in keyof S["fields"]]: FormTree } +} + + +export type ScalarSchema = ( + | Schema.String + | Schema.Number +) + + +const MySchema = Schema.Struct({ + name: Schema.String, + values: Schema.Array(Schema.String), +}) + +type TestFormTree = FormTree +declare const testFormTree: TestFormTree + +testFormTree.fields.name.value