-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathreference_hander.go
95 lines (76 loc) · 2.34 KB
/
reference_hander.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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package chaff
import (
"strings"
"github.com/thoas/go-funk"
)
type (
// Represents a single reference within the json schema
reference struct {
Path string
Generator Generator
SchemaNode schemaNode
}
// Used to handle references in the parsed structure of the json structure
// This gets populated as nodes are parsed
referenceHandler struct {
CurrentPath string
References map[string]reference
Errors map[string]error
}
// This struct used to track a stack of resolved references
// It is useful for handling circular references / cases where the generator could otherwise run forever
referenceResolver struct {
resolutions []string
}
)
func newReferenceHandler() referenceHandler {
return referenceHandler{
CurrentPath: "#",
References: make(map[string]reference),
Errors: make(map[string]error),
}
}
func (h *referenceHandler) ParseNodeInScope(scope string, node schemaNode, metadata *parserMetadata) (Generator, error) {
h.PushToPath(scope)
generator, err := parseNode(node, metadata)
h.PopFromPath(scope)
return generator, err
}
func (h *referenceHandler) PushToPath(pathPart string) {
h.CurrentPath += pathPart
}
func (h *referenceHandler) PopFromPath(pathPart string) {
h.CurrentPath = h.CurrentPath[:len(h.CurrentPath)-len(pathPart)]
}
func (h *referenceHandler) AddReference(node schemaNode, generator Generator) {
h.AddIdReference(h.CurrentPath, node, generator)
}
func (h *referenceHandler) AddIdReference(path string, node schemaNode, generator Generator) {
h.References[path] = reference{
Path: path,
SchemaNode: node,
Generator: generator,
}
}
func (h *referenceHandler) HandleError(err error) {
h.Errors[h.CurrentPath] = err
}
func (h *referenceHandler) Lookup(path string) (reference, bool) {
Reference, ok := h.References[path]
return Reference, ok
}
func (r *referenceResolver) PushRefResolution(reference string) {
r.resolutions = append(r.resolutions, reference)
}
func (r *referenceResolver) PopRefResolution() {
r.resolutions = r.resolutions[:len(r.resolutions)-1]
}
func (r *referenceResolver) HasResolved(reference string) bool {
return funk.ContainsString(r.resolutions, reference)
}
func (r *referenceResolver) GetResolutions() []string {
return r.resolutions
}
func (r *referenceResolver) GetFormattedResolutions() string {
return strings.Join(r.resolutions, " -> \n")
}