-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathslice.go
More file actions
45 lines (38 loc) · 960 Bytes
/
slice.go
File metadata and controls
45 lines (38 loc) · 960 Bytes
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
package dynjson
import "reflect"
type sliceFormatter struct {
t reflect.Type
elem formatter
}
func (f *sliceFormatter) typ() reflect.Type {
return f.t
}
func (f *sliceFormatter) format(src reflect.Value) (reflect.Value, error) {
dst := reflect.MakeSlice(f.t, src.Len(), src.Len())
for i := 0; i < src.Len(); i++ {
dv, err := f.elem.format(src.Index(i))
if err != nil {
return dv, err
}
dst.Index(i).Set(dv)
}
return dst, nil
}
type sliceBuilder struct {
t reflect.Type
elem *structBuilder
}
func (b *sliceBuilder) build(fields []string, prefix string) (formatter, error) {
et, err := b.elem.build(fields, prefix)
if err != nil {
return nil, err
}
return &sliceFormatter{t: reflect.SliceOf(et.typ()), elem: et}, nil
}
func makeSliceBuilder(t reflect.Type) (*sliceBuilder, error) {
elemBuilder, err := makeStructBuilder(t.Elem())
if err != nil {
return nil, err
}
return &sliceBuilder{t: t, elem: elemBuilder}, nil
}