-
Notifications
You must be signed in to change notification settings - Fork 0
/
struct_body.go
103 lines (86 loc) · 2.38 KB
/
struct_body.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
100
101
102
103
// Copyright 2021 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Code generated by embed.sh. DO NOT EDIT.
package codec
const structBody = `
«/*»
Template body for a struct type.
A struct is encoded as the start code, its exported fields, then
the end code. Each non-zero field is encoded as its field number followed by
its value. A field that equals its zero value isn't encoded.
«*/»
« $typeID := typeID .Type »
« $typeName := print $typeID "_codec" »
« $ptrTypeName := print "ptr_" $typeName »
« $goName := goName .Type »
var «$typeID»_type = reflect.TypeOf((*«$goName»)(nil)).Elem()
type «$typeName» struct{
«range .FieldTypes»
«typeID .»_codec *«typeID .»_codec
«- end»
fieldMap []int
}
func (c *«$typeName») Fields() []string {
return []string{«range .Fields»"«.Name»", «end»}
}
func (c *«$typeName») SetFieldMap(fm []int) {
c.fieldMap = fm
}
func (c *«$typeName») TypesUsed() []reflect.Type {
return []reflect.Type{«range .FieldTypes» «typeID .»_type, «end»}
}
func (c *«$typeName») SetCodecs(tcs []codecapi.TypeCodec) {
«- range $i, $t := .FieldTypes»
c.«typeID .»_codec = tcs[«$i»].(*«typeID $t»_codec)
«- end»
}
func (c *«$typeName») Encode(e *codecapi.Encoder, x interface{}) {
s := x.(«$goName»)
c.encode(e, &s)
}
func (c *«$typeName») encode(e *codecapi.Encoder, x *«$goName») {
e.StartStruct()
«range $i, $f := .Fields»
«- if $f.Type -»
«- if $f.Zero -»
if x.«$f.Name» != «$f.Zero» {
«- end»
e.EncodeUint(«$i»)
«encodeStmt .Type (print "x." $f.Name)»
«- if $f.Zero -»
}
«- end»
«- end»
«end -»
e.EndStruct()
}
func (c *«$typeName») Decode(d *codecapi.Decoder) interface{} {
var x «$goName»
c.decode(d, &x)
return x
}
func (c *«$typeName») decode(d *codecapi.Decoder, x *«$goName») {
d.StartStruct()
loop: for {
n := d.NextStructField(c.fieldMap)
switch n {
«range $i, $f := .Fields -»
«- if $f.Type -»
case «$i»:
«decodeStmt $f.Type (print "x." $f.Name)»
«end -»
«end -»
case -1:
break loop
case -2:
d.UnknownField("«$goName»")
default:
codecapi.Failf("bad struct field value: %d", n)
}
}
}
func init() {
codecapi.Register(«$typeID»_type, func() codecapi.TypeCodec { return &«$typeName»{} })
}
`