This repository has been archived by the owner on May 31, 2020. It is now read-only.
/
goform.go
99 lines (91 loc) · 2.12 KB
/
goform.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package goform
import (
_ "fmt"
h "github.com/metakeule/goh4"
. "github.com/metakeule/goh4/tag"
"github.com/metakeule/typeconverter"
)
type Filler interface {
Fill(m map[string]interface{}) error
Validate() error
}
func NewForm(objects ...interface{}) (f *FormHandler) {
f = &FormHandler{
Types: map[*Field]Type{},
Fields: map[string]*Field{},
Order: []h.Stringer{},
required: []*Field{},
Element: FORM(ATTR("method", "POST", "enctype", "multipart/form-data")),
}
for _, obj := range objects {
switch v := obj.(type) {
case []*Field:
for _, field := range v {
f.AddField(field)
}
case *Field:
f.AddField(v)
default:
f.AddHtml(v.(h.Stringer))
}
}
f.Reset()
return
}
func Selection(Field *Field, vals ...interface{}) *Field {
switch Field.Type {
case Int:
allowed := []int{}
for _, v := range vals {
var i int
typeconverter.Convert(v, &i)
allowed = append(allowed, i)
}
Field.Selection = allowed
case Float:
allowed := []float32{}
for _, v := range vals {
iv, ok := v.(float32)
if !ok {
iv = float32(v.(float64))
}
allowed = append(allowed, iv)
}
Field.Selection = allowed
case String:
allowed := []string{}
for _, v := range vals {
allowed = append(allowed, v.(string))
}
Field.Selection = allowed
}
if sel := Field.Element.Any(h.Tag("select")); sel != nil {
options := sel.All(h.Tag("option"))
for i, opt := range options {
var str string
typeconverter.Convert(vals[i], &str)
opt.Add(h.Attr("value", str))
}
}
return Field
}
func Required(name string, t Typer, html ...interface{}) (ø *Field) {
e := h.NewElement(h.Tag("form"), h.WithoutDecoration)
e.Add(html...)
ø = &Field{Name: name, Type: t.Type(), Element: e, Required: true}
if c, ok := t.(Constructor); ok {
ø.Constructor = c
}
ø.setFieldInfos()
return
}
func Optional(name string, t Typer, html ...interface{}) (ø *Field) {
e := h.NewElement(h.Tag("form"), h.WithoutDecoration)
e.Add(html...)
ø = &Field{Name: name, Type: t.Type(), Element: e, Required: false}
if c, ok := t.(Constructor); ok {
ø.Constructor = c
}
ø.setFieldInfos()
return
}