const Form = <A extends Schema.Struct.Fields>(
structSchema: A,
) =>
Schema.transformOrFail(
Schema.instanceOf(FormData),
Schema.Struct(structSchema),
{
strict: true,
decode: (input, options, ast) => {
const objectFromForm = Object.fromEntries(input)
const result = Schema.decodeUnknownEither(Schema.Struct(structSchema))(
objectFromForm,
)
if (Either.isLeft(result)) {
return ParseResult.fail(new ParseResult.Type(ast, input, "FormData does not match defined fields"))
}
return ParseResult.succeed(result.right)
},
encode: (item) => {
const formData = new FormData()
for (var key in item) {
formData.append(key, item[key])
}
return ParseResult.succeed(formData)
},
},
)
const Form = <A extends Schema.Struct.Fields>(
structSchema: A,
) =>
Schema.transformOrFail(
Schema.instanceOf(FormData),
Schema.Struct(structSchema),
{
strict: true,
decode: (input, options, ast) => {
const objectFromForm = Object.fromEntries(input)
const result = Schema.decodeUnknownEither(Schema.Struct(structSchema))(
objectFromForm,
)
if (Either.isLeft(result)) {
return ParseResult.fail(new ParseResult.Type(ast, input, "FormData does not match defined fields"))
}
return ParseResult.succeed(result.right)
},
encode: (item) => {
const formData = new FormData()
for (var key in item) {
formData.append(key, item[key])
}
return ParseResult.succeed(formData)
},
},
)