-
Notifications
You must be signed in to change notification settings - Fork 69
/
reflect.go
54 lines (44 loc) · 863 Bytes
/
reflect.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
package bus
import (
"reflect"
)
func marshal(thing interface{}) interface{} {
if thing == nil {
return nil
}
t := reflect.TypeOf(thing)
v := reflect.ValueOf(thing)
for t.Kind() == reflect.Ptr {
v = v.Elem()
t = v.Type()
}
return reflectOn(t, &v)
}
func reflectOn(t reflect.Type, v *reflect.Value) interface{} {
switch t.Kind() {
default:
return v.Interface()
case reflect.Slice:
l := make([]interface{}, v.Len())
for i := 0; i < v.Len(); i++ {
v2 := v.Index(i)
l[i] = reflectOn(v2.Type(), &v2)
}
return l
case reflect.Struct:
m := make(map[string]interface{})
for i := 0; i < t.NumField(); i++ {
field := t.Field(i)
if field.PkgPath != "" {
continue
}
tag, set := field.Tag.Lookup("mbus")
if !set {
continue
}
v2 := v.Field(i)
m[tag] = reflectOn(v2.Type(), &v2)
}
return m
}
}