form-binder is a clone of the formam package, slightly edited to use the "form" tag instead of "formam".
- Nesting ad infinitum in
maps
,structs
andslices
. UnmarshalText
in values and keys of maps.- the
map
's key supported are:string
,int
and variants,uint
and variants,uintptr
,float32
,float64
,bool
,struct
,custom types
to one of the above types registered by function orUnmarshalText
method, apointer
to one of the above types - A field with
interface{}
that has amap
,struct
orslice
as value is perfectly possible access to them! (see example below) - decode
time.Time
with format "2006-01-02" by its UnmarshalText method. - decode
url.URL
- The
slice
andarray
is possible to access without to indicate a index (If it is the last field, of course)` - You can to register a
func
for acustom type
for all fields that include it or one in particular! (see example below)
The supported field types in the destination struct are:
string
bool
int
,int8
,int16
,int32
,int64
uint
,uint8
,uint16
,uint32
,uint64
float32
,float64
slice
,array
struct
andstruct anonymous
map
interface{}
time.Time
url.URL
custom types
to one of the above types- a
pointer
to one of the above types
NOTE: the nesting in maps
, structs
and slices
can be ad infinitum.
- Use symbol
.
for access a field of a struct. (i.e,struct.field1
) - Use
[<index>]
for access to index of a slice/array. (i.e,struct.array[0]
). If the array/slice is the last field of the path, it is not necessary to indicate the index - Use
[<key>]
for access to key of a map. (i.e,struct.map[es-ES]
).
<!-- file: views/form.html -->
<form method="POST">
<input type="text" name="Name" value="Sony"/>
<input type="text" name="Location.Country" value="Japan"/>
<input type="text" name="Location.City" value="Tokyo"/>
<input type="text" name="Products[0].Name" value="Playstation 4"/>
<input type="text" name="Products[0].Type" value="Video games"/>
<input type="text" name="Products[1].Name" value="TV Bravia 32"/>
<input type="text" name="Products[1].Type" value="TVs"/>
<input type="text" name="Founders[0]" value="Masaru Ibuka"/>
<input type="text" name="Founders[0]" value="Akio Morita"/>
<input type="text" name="Employees" value="90000"/>
<input type="text" name="public" value="true"/>
<input type="url" name="website" value="http://www.sony.net"/>
<input type="date" name="foundation" value="1946-05-07"/>
<input type="text" name="Interface.ID" value="12"/>
<input type="text" name="Interface.Name" value="Go Programming Language"/>
<input type="submit"/>
</form>
// file: main.go
package main
import (
"net/url"
"time"
"github.com/kataras/iris"
)
type InterfaceStruct struct {
ID int
Name string
}
type Company struct {
Public bool `form:"public"`
Website url.URL `form:"website"`
Foundation time.Time `form:"foundation"`
Name string
Location struct {
Country string
City string
}
Products []struct {
Name string
Type string
}
Founders []string
Employees int64
Interface interface{}
}
func main() {
app := iris.New()
app.RegisterView(iris.HTML("./views", ".html"))
app.Get("/", func(ctx iris.Context) {
ctx.View("form.html")
})
// IMPORTANT
app.Post("/", func(ctx iris.Context) {
m := Company{
Interface: &InterfaceStruct{}, // its is possible to access to the fields although it's an interface field!
}
err := ctx.ReadForm(&m)
if err != nil {
ctx.StatusCode(iris.StatusBadRequest)
ctx.WriteString(err.Error())
}
})
}