forked from andyleap/gencode
/
type_time.go
68 lines (57 loc) · 1.69 KB
/
type_time.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
package golang
import (
"text/template"
"github.com/elojah/gencode/schema"
)
var (
TimeTemps *template.Template
)
func init() {
TimeTemps = template.New("TimeTemps")
template.Must(TimeTemps.New("marshal").Parse(`
{
b, err := {{.Target}}.MarshalBinary()
if err != nil {
return nil, err
}
copy(buf[{{if .W.IAdjusted}}i + {{end}}{{.W.Offset}}:], b)
}`))
template.Must(TimeTemps.New("unmarshal").Parse(`
{
{{.Target}}.UnmarshalBinary(buf[{{if .W.IAdjusted}}i + {{end}}{{.W.Offset}}:{{if .W.IAdjusted}}i + {{end}}{{.W.Offset}} + 15])
}`))
template.Must(TimeTemps.New("field").Parse(`time.Time`))
}
type TimeTemp struct {
*schema.TimeType
W *Walker
Target string
}
func (w *Walker) WalkTimeDef(tt *schema.TimeType) (parts *StringBuilder, err error) {
parts = &StringBuilder{}
err = parts.AddTemplate(TimeTemps, "field", tt)
return
}
func (w *Walker) WalkTimeSize(tt *schema.TimeType, target string) (parts *StringBuilder, err error) {
parts = &StringBuilder{}
w.Offset += 15
return
}
func (w *Walker) WalkTimeMarshal(tt *schema.TimeType, target string) (parts *StringBuilder, err error) {
parts = &StringBuilder{}
err = parts.AddTemplate(TimeTemps, "marshal", TimeTemp{tt, w, target})
w.Offset += 15
return
}
func (w *Walker) WalkTimeUnmarshal(tt *schema.TimeType, target string) (parts *StringBuilder, err error) {
parts = &StringBuilder{}
err = parts.AddTemplate(TimeTemps, "unmarshal", TimeTemp{tt, w, target})
w.Offset += 15
return
}
func (w *Walker) WalkTimeUnmarshalSafe(tt *schema.TimeType, target string) (parts *StringBuilder, err error) {
parts = &StringBuilder{}
err = parts.AddTemplate(TimeTemps, "unmarshal", TimeTemp{tt, w, target})
w.Offset += 15
return
}