# go-form
Creating and processing HTML forms is hard and repetitive. You need to deal with rendering HTML form fields, validating submitted data, mapping the form data into objects and a lot more. [`go-form`][go-form] includes a powerful form feature that provides all these features.
## Introduction
[`go-form`][go-form] is heavily influenced by [Symfony Form](https://symfony.com/doc/current/forms.html). It includes:
* A form builder based on fields declarations and independent of structs
* Validation based on constraints
* Data mounting to populate a form from a struct instance
* Data binding to populate a struct instance from a submitted form
* Form renderer with customizable themes
## Installation
```shell
go get gitnet.fr/deblan/go-form
```
## Quick Start
```go
package main
import (
"html/template"
"log"
"net/http"
"gitnet.fr/deblan/go-form/form"
"gitnet.fr/deblan/go-form/theme"
"gitnet.fr/deblan/go-form/validation"
)
func main() {
type Person struct {
Name string
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
data := new(Person)
f := form.NewForm(
form.NewFieldText("Name").
WithOptions(
form.NewOption("label", "Your name"),
).
WithConstraints(
validation.NewNotBlank(),
),
form.NewSubmit("submit"),
).
End().
WithMethod(http.MethodPost).
WithAction("/")
f.Mount(data)
if r.Method == f.Method {
f.HandleRequest(r)
if f.IsSubmitted() && f.IsValid() {
f.Bind(data)
}
}
render := theme.NewRenderer(theme.Html5)
tpl, _ := template.New("page").Funcs(render.FuncMap()).Parse(`{{ form .Form }}`)
w.Header().Set("Content-Type", "text/html; charset=utf-8")
tpl.Execute(w, map[string]any{
"Form": f,
})
})
log.Fatal(http.ListenAndServe(":1324", nil))
}
```
[go-form]: https://gitnet.fr/deblan/go-form