-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathservices.go
78 lines (66 loc) · 1.47 KB
/
services.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
package main
import (
"go/ast"
"go/token"
"sort"
)
type Services map[string]*Service
func (services Services) ServiceNames() []string {
// Sort services to the output file is neat and deterministic.
var serviceNames []string
for name := range services {
serviceNames = append(serviceNames, name)
}
sort.Strings(serviceNames)
return serviceNames
}
func (services Services) ServicesWithScope(scope string) Services {
ss := make(Services)
for serviceName, service := range services {
if service.Scope == scope {
ss[serviceName] = service
}
}
return ss
}
// astContainer creates the Container struct.
func (services Services) astContainerStruct() *ast.GenDecl {
var containerFields []*ast.Field
for _, serviceName := range services.ServiceNames() {
service := services[serviceName]
containerFields = append(containerFields, &ast.Field{
Names: []*ast.Ident{
{Name: serviceName},
},
Type: service.ContainerFieldType(services),
})
}
return &ast.GenDecl{
Tok: token.TYPE,
Specs: []ast.Spec{
&ast.TypeSpec{
Name: newIdent("Container"),
Type: &ast.StructType{
Fields: &ast.FieldList{
List: containerFields,
},
},
},
},
}
}
func (services Services) astDefaultContainer() *ast.GenDecl {
return &ast.GenDecl{
Tok: token.VAR,
Specs: []ast.Spec{
&ast.ValueSpec{
Names: []*ast.Ident{
{Name: "DefaultContainer"},
},
Values: []ast.Expr{
&ast.Ident{Name: "NewContainer()"},
},
},
},
}
}