-
Notifications
You must be signed in to change notification settings - Fork 0
/
baseorderedmap.go
102 lines (84 loc) · 2.2 KB
/
baseorderedmap.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
96
97
98
99
100
101
102
package main
import (
"errors"
"fmt"
"go/ast"
"path/filepath"
"strings"
)
type baseOrderedMapGenerator struct {
template string
}
type orderedMap struct {
Name string
CapitalizedName string
PkgName string
KeyType string
ValueType string
UsedImports map[string]struct{}
}
func (baseOrderedMapGenerator) collectUsedTypes(data, order *ast.Field, m *orderedMap) error {
mapType, ok := data.Type.(*ast.MapType)
if !ok {
return errors.New(`"data" field should be a map`)
}
var err error
m.KeyType, err = typeToString(mapType.Key)
if err != nil {
return fmt.Errorf(`failed to get "data" map key type: %w`, err)
}
m.ValueType, err = typeToString(mapType.Value)
if err != nil {
return fmt.Errorf(`failed to get "data" map value type: %w`, err)
}
slice, ok := order.Type.(*ast.ArrayType)
if !ok {
return errors.New(`"order" field should be a slice`)
}
sliceType, err := typeToString(slice.Elt)
if err != nil {
return fmt.Errorf(`failed to get "order" slice item type: %w`, err)
}
if sliceType != m.KeyType {
return fmt.Errorf(
`"order" slice item type %q isn't equal to %q`,
sliceType,
m.KeyType,
)
}
return nil
}
func (g baseOrderedMapGenerator) fillImports(om *orderedMap, imports map[string]string) error {
if pkg := g.getTypePackage(om.ValueType); pkg != "" {
p, ok := imports[pkg]
if !ok {
return fmt.Errorf("failed to find value's import for type %q", om.ValueType)
}
om.UsedImports[p] = struct{}{}
}
if pkg := g.getTypePackage(om.KeyType); pkg != "" {
p, ok := imports[pkg]
if !ok {
return fmt.Errorf("failed to find key's import for type %q", om.KeyType)
}
om.UsedImports[p] = struct{}{}
}
return nil
}
func (baseOrderedMapGenerator) getTypePackage(t string) string {
parts := strings.SplitN(t, ".", 2)
if len(parts) != 2 {
return ""
}
conversationMap := map[string]string{
"jschema": "jsight-schema-go-library",
}
if p, ok := conversationMap[parts[0]]; ok {
return p
}
return parts[0]
}
func (g baseOrderedMapGenerator) generateCode(om orderedMap, dirPath string) error {
path := filepath.Join(dirPath, camelCaseToUnderscore(om.Name)+"_gen.go")
return renderTemplateToFile(g.template, path, om)
}