MCPcopy Create free account
hub / github.com/egonelbre/exp / parse

Function parse

view/parse.go:22–78  ·  view source on GitHub ↗
(name string, v reflect.Value)

Source from the content-addressed store, hash-verified

20}
21
22func parse(name string, v reflect.Value) (*Node, error) {
23 for v.Kind() == reflect.Ptr {
24 v = v.Elem()
25 }
26
27 if v.Kind() != reflect.Struct && v.Kind() != reflect.Slice {
28 panic("ViewModel should be a struct or slice.")
29 }
30
31 t := v.Type()
32
33 node := &Node{
34 Name: name,
35 Type: t.Name(),
36 Slice: v.Kind() == reflect.Slice,
37 Value: v,
38 }
39
40 if node.Type == "" {
41 node.Type = node.Name
42 }
43
44 if v.Kind() == reflect.Slice {
45 for i := 0; i < v.Len(); i++ {
46 f := v.Index(i)
47 child, err := parse("", f)
48 if err != nil {
49 return nil, err
50 }
51 node.Children = append(node.Children, child)
52 }
53 return node, nil
54 }
55
56 for i := 0; i < v.NumField(); i++ {
57 f := v.Field(i)
58 if f.Kind() == reflect.Struct || f.Kind() == reflect.Slice {
59 child, err := parse(t.Field(i).Name, f)
60 if err != nil {
61 return nil, err
62 }
63 node.Children = append(node.Children, child)
64 } else {
65 if node.Props == nil {
66 node.Props = make(map[string]*Prop)
67 }
68
69 name := t.Field(i).Name
70 node.Props[name] = &Prop{
71 Type: f.Type().Name(),
72 Value: f,
73 }
74 }
75 }
76
77 return node, nil
78}
79

Callers 1

ParseFunction · 0.85

Calls 3

TypeMethod · 0.80
NameMethod · 0.65
LenMethod · 0.45

Tested by

no test coverage detected