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