Form work
All checks were successful
Lint / lint (push) Successful in 59s

This commit is contained in:
Julien Valverdé
2025-04-15 04:25:06 +02:00
parent 66de31706c
commit 9436602443

View File

@@ -1,4 +1,4 @@
import { Schema, SubscriptionRef } from "effect" import { Schema } from "effect"
export interface Form<A, I, R> { export interface Form<A, I, R> {
@@ -7,40 +7,38 @@ export interface Form<A, I, R> {
export type FormTree<S extends Schema.Schema<any>> = ( export type FormTree<S extends Schema.Schema<any>> = (
S extends Schema.Array$<any> ? ArrayFormField<S> :
S extends Schema.Struct<any> ? StructFormField<S> : S extends Schema.Struct<any> ? StructFormField<S> :
S extends ScalarSchema ? ScalarFormField<S> : GenericFormField<S>
S["Type"]
) )
export interface FormField<S extends Schema.Schema<any>> { export interface GenericFormField<S extends Schema.Schema<any>> {
readonly value: SubscriptionRef.SubscriptionRef<S["Type"]> readonly _tag: "GenericFormField"
}
export interface ScalarFormField<S extends ScalarSchema> extends FormField<S> {
readonly _tag: "ScalarFormField"
readonly schema: S readonly schema: S
readonly value: S["Type"]
} }
export interface StructFormField<S extends Schema.Struct<any>> extends FormField<S> { export interface ArrayFormField<S extends Schema.Array$<any>> {
readonly _tag: "ArrayFormField"
readonly schema: S
readonly elements: readonly FormTree<S["value"]>[]
}
export interface StructFormField<S extends Schema.Struct<any>> {
readonly _tag: "StructFormField" readonly _tag: "StructFormField"
readonly schema: S readonly schema: S
readonly fields: { [K in keyof S["fields"]]: FormTree<S["fields"][K]> } readonly fields: { [K in keyof S["fields"]]: FormTree<S["fields"][K]> }
} }
export type ScalarSchema = (
| Schema.String
| Schema.Number
)
const MySchema = Schema.Struct({ const MySchema = Schema.Struct({
name: Schema.String, name: Schema.String,
symbol: Schema.SymbolFromSelf,
values: Schema.Array(Schema.String), values: Schema.Array(Schema.String),
}) })
type TestFormTree = FormTree<typeof MySchema> type TestFormTree = FormTree<typeof MySchema>
declare const testFormTree: TestFormTree declare const testFormTree: TestFormTree
testFormTree.fields.name.value testFormTree.fields.values.elements