-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathroot.go
84 lines (72 loc) · 2.14 KB
/
root.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
package chaff
import (
"fmt"
)
type (
// Root generator a given schema. Call the Generate method on this to generate a value
RootGenerator struct {
Generator Generator
// For any "$defs"
Defs map[string]Generator
// For any "definitions"
Definitions map[string]Generator
// Metadata related to parser operations
Metadata *parserMetadata
}
)
// Parses the top-level properties of a schema (including "$defs" and "definitions")
// Example:
// {
// "type": "object",
// "$defs": {
// "foo": {
// "type": "string"
// }
// },
// "properties": {
// "bar": {
// "$ref": "#/$defs/foo"
// }
// }
// }
func parseRoot(node schemaNode, metadata *parserMetadata) (RootGenerator, error) {
def := parseDefinitions("$defs", metadata, node.Defs)
definitions := parseDefinitions("definitions", metadata, node.Definitions)
generator, err := parseNode(node, metadata)
return RootGenerator{
Generator: generator,
Defs: def,
Definitions: definitions,
Metadata: metadata,
}, err
}
func parseDefinitions(path string, metadata *parserMetadata, definitions map[string]schemaNode) map[string]Generator {
ref := metadata.ReferenceHandler
generators := make(map[string]Generator)
for key, value := range definitions {
refPath := fmt.Sprintf("/%s/%s", path, key)
generator, _ := ref.ParseNodeInScope(refPath, value, metadata)
generators[key] = generator
}
return generators
}
// Generates values based on the passed options
func (g RootGenerator) Generate(opts *GeneratorOptions) interface{} {
opts = withGeneratorOptionsDefaults(*opts)
return g.Generator.Generate(opts)
}
func (g RootGenerator) GenerateWithDefaults() interface{} {
opts := withGeneratorOptionsDefaults(GeneratorOptions{})
return g.Generator.Generate(opts)
}
func (g RootGenerator) String() string {
formattedString := ""
for name, prop := range g.Definitions {
formattedString += fmt.Sprintf("%s: %s,", name, prop)
}
formattedString += "$defs:"
for name, prop := range g.Defs {
formattedString += fmt.Sprintf("%s: %s,", name, prop)
}
return fmt.Sprintf("RootGenerator{Generator: %s Definitions: %s}", g.Generator, formattedString)
}