-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbase_writer.go
48 lines (41 loc) · 1.29 KB
/
base_writer.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
package peanut
import (
"reflect"
)
type base struct {
headersByType map[reflect.Type][]string // headersByType is a list of headers for each struct type.
typesByType map[reflect.Type][]reflect.Type // typesByType is a list of reflected field types for each struct type.
tagsByType map[reflect.Type][]string // tagsByType is a list of field tags for each struct type.
closed bool
}
// register a type and collect its metadata.
// If the type is a newly registered type
// (has not been seen before),
// return true. Otherwise return false.
func (w *base) register(x interface{}) (reflect.Type, bool) {
// Lazy init.
if w.headersByType == nil {
w.headersByType = make(map[reflect.Type][]string)
w.typesByType = make(map[reflect.Type][]reflect.Type)
w.tagsByType = make(map[reflect.Type][]string)
}
t := baseType(x)
// Is this type already registered?
if _, ok := w.headersByType[t]; ok {
// Yes.
return t, false
}
var headers []string
var types []reflect.Type
var tags []string
reflectStructFields(x, func(name string, t reflect.Type, tag string) {
h := firstTagValue(tag)
headers = append(headers, h)
types = append(types, t)
tags = append(tags, tag)
})
w.headersByType[t] = headers
w.typesByType[t] = types
w.tagsByType[t] = tags
return t, true
}