Help us shape the future of Go! Take the 2026 Go Developer Survey

form

package
v0.10.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 31, 2026 License: Apache-2.0 Imports: 8 Imported by: 0

Documentation

Overview

Package form holds the typed fields of a page's forms. For <ssr:form name="add"> in a template, aicoded generate writes FormAddValues: a BaseFormValues and one field for each <ssr:input>, <ssr:select> and <ssr:textarea> in the form, such as Input[string], Select[int] or File. Generated code reads the posted values into the fields; the page's data provider sets initial values and options and reads the results in two hooks:

  • InitAdd runs every time the page shows the form, and on a post after the form's token is checked and before the posted values are read. Set default values with SetValue and the options of every select with SetOptions.
  • ProcessAdd runs only for the posted form, and only when every field is valid: required fields are filled, numbers parse and each select value is one of its enabled options. Check there what only the server knows, such as whether a login is taken. Set an error on a field with its SetError, or on the whole form with BaseFormValues.SetError, and return nil to show the form again with the errors; return web.Redirect to show the result.

A posted form is at most 32 MiB. A form with a file field is posted as multipart/form-data; read an uploaded file with the Open method of its FileHeader.

Read more in the guide docs/guides/forms.md and the task docs/tasks/add-form.md, which aicoded explain and the MCP tool howto print as guides/forms and tasks/add-form.

Index

Examples

Constants

View Source
const (
	// MessageRequiredField is the error of a required field left empty.
	MessageRequiredField = "This field is required"

	// MessageInvalidOption is the error of a select whose submitted value is not one of its
	// options.
	MessageInvalidOption = "Choose one of the options"

	// MultipartFormData is the content type of a form that carries files.
	MultipartFormData = "multipart/form-data"
)

Variables

This section is empty.

Functions

func IsMultipart

func IsMultipart(r *http.Request) bool

IsMultipart reports whether r carries a multipart/form-data body.

Generated code only.

Types

type BaseFormValues

type BaseFormValues struct {
	// contains filtered or unexported fields
}

BaseFormValues is what every form has besides its fields: its id, the viewer's form token, a form-wide error and whether the posted values were checked.

func (*BaseFormValues) GetError

func (f *BaseFormValues) GetError() string

GetError returns the error about the form as a whole.

func (*BaseFormValues) HasError

func (f *BaseFormValues) HasError() bool

HasError reports whether the form or any of its fields has an error.

func (*BaseFormValues) ID

func (f *BaseFormValues) ID() string

ID returns the form's id, as posted in the hidden input web.FormField.

func (*BaseFormValues) IsValidated

func (f *BaseFormValues) IsValidated() bool

IsValidated reports whether the form was submitted and its values checked.

func (*BaseFormValues) MarkValidated

func (f *BaseFormValues) MarkValidated()

MarkValidated records that the posted values were checked. Generated code calls it.

Generated code only.

func (*BaseFormValues) Prepare

func (f *BaseFormValues) Prepare(id, token string)

Prepare sets the form's id and the viewer's token, which the rendered form carries in hidden inputs. Generated code calls it.

Generated code only.

func (*BaseFormValues) SetElements

func (f *BaseFormValues) SetElements(elements []Element)

SetElements sets the fields HasError looks at. Generated code calls it.

Generated code only.

func (*BaseFormValues) SetError

func (f *BaseFormValues) SetError(err string)

SetError sets an error about the form as a whole.

func (*BaseFormValues) Token

func (f *BaseFormValues) Token() string

Token returns the token posted in the hidden input web.CSRFField.

type Element

type Element interface {
	HasError() bool
}

Element is a form field.

type ElementValueType

type ElementValueType interface {
	string | int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64 | float32 | float64 | bool
}

ElementValueType lists the value types a form field can have.

type File

type File struct {
	// contains filtered or unexported fields
}

File is a file <input> field.

func (*File) GetError

func (e *File) GetError() string

GetError returns the field's error.

func (*File) GetValue

func (e *File) GetValue() *FileHeader

GetValue returns the uploaded file, or nil.

func (*File) HasError

func (e *File) HasError() bool

HasError reports whether the field has an error.

func (*File) IsNotNull

func (e *File) IsNotNull() bool

IsNotNull reports whether a file was uploaded.

func (*File) Process

func (e *File) Process(r *http.Request, name string, isMultipart, isRequired bool)

Process reads the field from the parsed form in r. Generated code calls it.

Generated code only.

func (*File) SetError

func (e *File) SetError(err string)

SetError sets the field's error.

type FileHeader

type FileHeader struct {
	*multipart.FileHeader
}

FileHeader describes an uploaded file. Open reads its content.

type FileMultiple

type FileMultiple struct {
	// contains filtered or unexported fields
}

FileMultiple is a file <input multiple> field.

func (*FileMultiple) GetError

func (e *FileMultiple) GetError() string

GetError returns the field's error.

func (*FileMultiple) GetValue

func (e *FileMultiple) GetValue() []*FileHeader

GetValue returns the uploaded files.

func (*FileMultiple) HasError

func (e *FileMultiple) HasError() bool

HasError reports whether the field has an error.

func (*FileMultiple) IsNotNull

func (e *FileMultiple) IsNotNull() bool

IsNotNull reports whether Process ran for a multipart form, even one without files.

func (*FileMultiple) Process

func (e *FileMultiple) Process(r *http.Request, name string, isMultipart, isRequired bool)

Process reads the field from the parsed form in r. Generated code calls it.

Generated code only.

func (*FileMultiple) SetError

func (e *FileMultiple) SetError(err string)

SetError sets the field's error.

type Input

type Input[T ElementValueType] struct {
	// contains filtered or unexported fields
}

Input is a single-valued <input> field.

func (*Input[T]) GetError

func (e *Input[T]) GetError() string

GetError returns the field's error.

func (*Input[T]) GetFormValue

func (e *Input[T]) GetFormValue() string

GetFormValue returns the text posted for the field, so a value that did not parse can be shown again.

func (*Input[T]) GetValue

func (e *Input[T]) GetValue() T

GetValue returns the field's value.

func (*Input[T]) HasError

func (e *Input[T]) HasError() bool

HasError reports whether the field has an error.

func (*Input[T]) IsNotNull

func (e *Input[T]) IsNotNull() bool

IsNotNull reports whether the field has a value, set or posted.

func (*Input[T]) Process

func (e *Input[T]) Process(r *http.Request, name string, isMultipart, isRequired bool)

Process reads the field from the parsed form in r. Generated code calls it.

Generated code only.

func (*Input[T]) SetError

func (e *Input[T]) SetError(err string)

SetError sets the field's error.

Example

Process<Form> runs only when every field is valid, so it checks what only the server knows and sets the error that the page shows next to the field.

package main

import (
	"fmt"

	"aicoded.dev/framework/web/form"
)

func main() {
	taken := map[string]bool{"alice": true, "bob": true}
	var login form.Input[string] // a field of the generated Form<Name>Values
	login.SetValue("alice")      // as the viewer posted it

	if taken[login.GetValue()] {
		login.SetError("This login is taken.")
	}
	fmt.Println(login.HasError(), login.GetError())
}
Output:
true This login is taken.

func (*Input[T]) SetValue

func (e *Input[T]) SetValue(v T)

SetValue sets the field's value.

type InputMultiple

type InputMultiple[T ElementValueType] struct {
	// contains filtered or unexported fields
}

InputMultiple is an <input> field that takes several values, such as a group of checkboxes sharing a name.

func (*InputMultiple[T]) GetError

func (e *InputMultiple[T]) GetError() string

GetError returns the field's error.

func (*InputMultiple[T]) GetFormValue

func (e *InputMultiple[T]) GetFormValue() string

GetFormValue returns "": a multi-valued field keeps no posted text.

func (*InputMultiple[T]) GetValue

func (e *InputMultiple[T]) GetValue() map[T]struct{}

GetValue returns the field's values.

func (*InputMultiple[T]) HasError

func (e *InputMultiple[T]) HasError() bool

HasError reports whether the field has an error.

func (*InputMultiple[T]) IsNotNull

func (e *InputMultiple[T]) IsNotNull() bool

IsNotNull reports whether the field has values, set or posted.

func (*InputMultiple[T]) Process

func (e *InputMultiple[T]) Process(r *http.Request, name string, isMultipart, isRequired bool)

Process reads the field from the parsed form in r. Generated code calls it.

Generated code only.

func (*InputMultiple[T]) SetError

func (e *InputMultiple[T]) SetError(err string)

SetError sets the field's error.

func (*InputMultiple[T]) SetValue

func (e *InputMultiple[T]) SetValue(v map[T]struct{})

SetValue sets the field's values.

type Select

type Select[T ElementValueType] struct {
	// contains filtered or unexported fields
}

Select is a single-valued <select> field. A posted value must be one of its options.

func (*Select[T]) GetError

func (e *Select[T]) GetError() string

GetError returns the field's error.

func (*Select[T]) GetOptions

func (e *Select[T]) GetOptions() []SelectOptionElement[T]

GetOptions returns the field's options.

func (*Select[T]) GetValue

func (e *Select[T]) GetValue() T

GetValue returns the field's value.

func (*Select[T]) HasError

func (e *Select[T]) HasError() bool

HasError reports whether the field has an error.

func (*Select[T]) IsNotNull

func (e *Select[T]) IsNotNull() bool

IsNotNull reports whether the field has a value, set or posted.

func (*Select[T]) Process

func (e *Select[T]) Process(r *http.Request, name string, isMultipart, isRequired bool)

Process reads the field from the parsed form in r. Generated code calls it after the form's options are set.

Generated code only.

func (*Select[T]) SetError

func (e *Select[T]) SetError(err string)

SetError sets the field's error.

func (*Select[T]) SetOptions

func (e *Select[T]) SetOptions(o []SelectOptionElement[T])

SetOptions sets the options a viewer can choose from.

Example

Init<Form> sets the options of a select, alone or in groups. A viewer can post only the value of an enabled option; any other value gets form.MessageInvalidOption.

package main

import (
	"fmt"
	"slices"

	"aicoded.dev/framework/web/form"
)

func main() {
	var team form.Select[string] // a field of the generated Form<Name>Values
	team.SetOptions([]form.SelectOptionElement[string]{
		form.SelectOption[string]{Value: "ops", Label: "Operations"},
		form.SelectOptionGroup[string]{Label: "Sales", Options: []form.SelectOptionElement[string]{
			form.SelectOption[string]{Value: "sales-eu", Label: "Europe"},
			form.SelectOption[string]{Value: "sales-us", Label: "Americas", Disabled: true},
		}},
	})
	for _, v := range []string{"ops", "sales-eu", "sales-us", "hr"} {
		offered := slices.ContainsFunc(team.GetOptions(), func(o form.SelectOptionElement[string]) bool { return o.Allows(v) })
		fmt.Println(v, offered)
	}
}
Output:
ops true
sales-eu true
sales-us false
hr false

func (*Select[T]) SetValue

func (e *Select[T]) SetValue(v T)

SetValue sets the field's value.

type SelectMultiple

type SelectMultiple[T ElementValueType] struct {
	// contains filtered or unexported fields
}

SelectMultiple is a <select multiple> field. Every posted value must be one of its options.

func (*SelectMultiple[T]) GetError

func (e *SelectMultiple[T]) GetError() string

GetError returns the field's error.

func (*SelectMultiple[T]) GetOptions

func (e *SelectMultiple[T]) GetOptions() []SelectOptionElement[T]

GetOptions returns the field's options.

func (*SelectMultiple[T]) GetValue

func (e *SelectMultiple[T]) GetValue() map[T]struct{}

GetValue returns the field's values.

func (*SelectMultiple[T]) HasError

func (e *SelectMultiple[T]) HasError() bool

HasError reports whether the field has an error.

func (*SelectMultiple[T]) IsNotNull

func (e *SelectMultiple[T]) IsNotNull() bool

IsNotNull reports whether the field has values, set or posted.

func (*SelectMultiple[T]) Process

func (e *SelectMultiple[T]) Process(r *http.Request, name string, isMultipart, isRequired bool)

Process reads the field from the parsed form in r. Generated code calls it after the form's options are set.

Generated code only.

func (*SelectMultiple[T]) SetError

func (e *SelectMultiple[T]) SetError(err string)

SetError sets the field's error.

func (*SelectMultiple[T]) SetOptions

func (e *SelectMultiple[T]) SetOptions(o []SelectOptionElement[T])

SetOptions sets the options a viewer can choose from.

func (*SelectMultiple[T]) SetValue

func (e *SelectMultiple[T]) SetValue(v map[T]struct{})

SetValue sets the field's values.

type SelectOption

type SelectOption[T ElementValueType] struct {
	Value    T
	Label    string
	Disabled bool
}

SelectOption is one option of a select field.

func (SelectOption[T]) Allows

func (o SelectOption[T]) Allows(v T) bool

Allows reports whether v is this option's value and the option is enabled.

func (SelectOption[T]) WriteHtml

func (o SelectOption[T]) WriteHtml(w io.Writer, isSelected func(v T) bool) error

WriteHtml writes the option as an <option> element.

type SelectOptionElement

type SelectOptionElement[T ElementValueType] interface {
	// WriteHtml writes the element's markup, marking the options for which isSelected holds.
	WriteHtml(w io.Writer, isSelected func(v T) bool) error

	// Allows reports whether v is an option a viewer can choose.
	Allows(v T) bool
}

SelectOptionElement is an option or a group of options of a select field.

type SelectOptionGroup

type SelectOptionGroup[T ElementValueType] struct {
	Label    string
	Disabled bool
	Options  []SelectOptionElement[T]
}

SelectOptionGroup is a labelled group of options of a select field.

func (SelectOptionGroup[T]) Allows

func (o SelectOptionGroup[T]) Allows(v T) bool

Allows reports whether the group is enabled and one of its options allows v.

func (SelectOptionGroup[T]) WriteHtml

func (o SelectOptionGroup[T]) WriteHtml(w io.Writer, isSelected func(v T) bool) error

WriteHtml writes the group as an <optgroup> element.

type Textarea

type Textarea struct {
	// contains filtered or unexported fields
}

Textarea is a <textarea> field.

func (*Textarea) GetError

func (e *Textarea) GetError() string

GetError returns the field's error.

func (*Textarea) GetValue

func (e *Textarea) GetValue() string

GetValue returns the field's text.

func (*Textarea) HasError

func (e *Textarea) HasError() bool

HasError reports whether the field has an error.

func (*Textarea) IsNotNull

func (e *Textarea) IsNotNull() bool

IsNotNull reports whether the field has a value, set or posted.

func (*Textarea) Process

func (e *Textarea) Process(r *http.Request, name string, isMultipart, isRequired bool)

Process reads the field from the parsed form in r. Generated code calls it.

Generated code only.

func (*Textarea) SetError

func (e *Textarea) SetError(err string)

SetError sets the field's error.

func (*Textarea) SetValue

func (e *Textarea) SetValue(v string)

SetValue sets the field's text.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL