...
1
16
17 package explain
18
19 import "k8s.io/kube-openapi/pkg/util/proto"
20
21
22 const indentPerLevel = 3
23
24
25
26 type recursiveFieldsPrinter struct {
27 Writer *Formatter
28 Error error
29 }
30
31 var _ proto.SchemaVisitor = &recursiveFieldsPrinter{}
32 var _ fieldsPrinter = &recursiveFieldsPrinter{}
33 var visitedReferences = map[string]struct{}{}
34
35
36 func (f *recursiveFieldsPrinter) VisitArray(a *proto.Array) {
37 a.SubType.Accept(f)
38 }
39
40
41
42 func (f *recursiveFieldsPrinter) VisitKind(k *proto.Kind) {
43 for _, key := range k.Keys() {
44 v := k.Fields[key]
45 f.Writer.Write("%s\t<%s>", key, GetTypeName(v))
46 subFields := &recursiveFieldsPrinter{
47 Writer: f.Writer.Indent(indentPerLevel),
48 }
49 if err := subFields.PrintFields(v); err != nil {
50 f.Error = err
51 return
52 }
53 }
54 }
55
56
57 func (f *recursiveFieldsPrinter) VisitMap(m *proto.Map) {
58 m.SubType.Accept(f)
59 }
60
61
62 func (f *recursiveFieldsPrinter) VisitPrimitive(p *proto.Primitive) {
63
64 }
65
66
67 func (f *recursiveFieldsPrinter) VisitReference(r proto.Reference) {
68 if _, ok := visitedReferences[r.Reference()]; ok {
69 return
70 }
71 visitedReferences[r.Reference()] = struct{}{}
72 r.SubSchema().Accept(f)
73 delete(visitedReferences, r.Reference())
74 }
75
76
77
78 func (f *recursiveFieldsPrinter) PrintFields(schema proto.Schema) error {
79 schema.Accept(f)
80 return f.Error
81 }
82
View as plain text