OSDN Git Service

new repo
[bytom/vapor.git] / vendor / github.com / tendermint / go-wire / gen / gentmpl.go
1 package gen
2
3 import (
4         "strings"
5
6         "github.com/clipperhouse/typewriter"
7 )
8
9 var templates = typewriter.TemplateSlice{
10         wrapper,
11         register,
12 }
13
14 // this is the template for generating the go-data wrappers of an interface
15 var wrapper = &typewriter.Template{
16         Name:           "Wrapper",
17         TypeConstraint: typewriter.Constraint{},
18         FuncMap:        fmap,
19         Text: `
20 type {{.Wrapper}} struct {
21   {{.Inner}} "json:\"unwrap\""
22 }
23
24 var {{.Wrapper}}Mapper = data.NewMapper({{.Wrapper}}{})
25
26 func (h {{.Wrapper}}) MarshalJSON() ([]byte, error) {
27   return {{.Wrapper}}Mapper.ToJSON(h.{{.Inner}})
28 }
29
30 func (h *{{.Wrapper}}) UnmarshalJSON(data []byte) (err error) {
31   parsed, err := {{.Wrapper}}Mapper.FromJSON(data)
32   if err == nil && parsed != nil {
33     h.{{.Inner}} = parsed.({{.Inner}})
34   }
35   return err
36 }
37
38 // Unwrap recovers the concrete interface safely (regardless of levels of embeds)
39 func (h {{.Wrapper}}) Unwrap() {{.Inner}} {
40   hi := h.{{.Inner}}
41   for wrap, ok := hi.({{.Wrapper}}); ok; wrap, ok = hi.({{.Wrapper}}) {
42     hi = wrap.{{.Inner}}
43   }
44   return hi
45 }
46
47 func (h {{.Wrapper}}) Empty() bool {
48   return h.{{.Inner}} == nil
49 }
50
51 /*** below are bindings for each implementation ***/
52 `,
53 }
54
55 var register = &typewriter.Template{
56         Name:           "Register",
57         TypeConstraint: typewriter.Constraint{},
58         FuncMap:        fmap,
59         Text: `
60 func init() {
61   {{.Wrapper}}Mapper.RegisterImplementation({{ if .Impl.Pointer }}&{{ end }}{{.Impl.Name}}{}, "{{.ImplType }}", 0x{{.Count}})
62 }
63
64 func (hi {{ if .Impl.Pointer }}*{{ end }}{{.Impl.Name}}) Wrap() {{.Wrapper}} {
65   return {{.Wrapper}}{hi}
66 }
67 `,
68 }
69
70 var fmap = map[string]interface{}{
71         "ToLower": strings.ToLower,
72 }