-
Notifications
You must be signed in to change notification settings - Fork 229
/
infragen.go
86 lines (80 loc) · 2.42 KB
/
infragen.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
package infragen
import (
"encr.dev/pkg/fns"
"encr.dev/pkg/option"
"encr.dev/pkg/paths"
"encr.dev/v2/app"
"encr.dev/v2/codegen"
"encr.dev/v2/codegen/infragen/cachegen"
"encr.dev/v2/codegen/infragen/configgen"
"encr.dev/v2/codegen/infragen/metricsgen"
"encr.dev/v2/codegen/infragen/pubsubgen"
"encr.dev/v2/codegen/infragen/secretsgen"
"encr.dev/v2/internals/pkginfo"
"encr.dev/v2/parser/infra/caches"
"encr.dev/v2/parser/infra/config"
"encr.dev/v2/parser/infra/metrics"
"encr.dev/v2/parser/infra/pubsub"
"encr.dev/v2/parser/infra/secrets"
"encr.dev/v2/parser/resource"
)
func Process(gg *codegen.Generator, appDesc *app.Desc) {
type groupKey struct {
pkg paths.Pkg
kind resource.Kind
}
groups := make(map[groupKey][]resource.Resource)
pkgMap := make(map[paths.Pkg]*pkginfo.Package)
for _, r := range appDesc.Parse.Resources() {
// Group by package.
var pkg *pkginfo.Package
switch r := r.(type) {
case *caches.Keyspace:
pkg = r.File.Pkg
case *metrics.Metric:
pkg = r.File.Pkg
case *secrets.Secrets:
pkg = r.File.Pkg
case *pubsub.Subscription:
pkg = r.File.Pkg
case *config.Load:
pkg = r.File.Pkg
default:
continue
}
key := groupKey{pkg: pkg.ImportPath, kind: r.Kind()}
groups[key] = append(groups[key], r)
pkgMap[pkg.ImportPath] = pkg
}
for key, resources := range groups {
pkg := pkgMap[key.pkg]
switch key.kind {
case resource.CacheKeyspace:
cachegen.GenKeyspace(gg, pkg, fns.Map(resources, func(r resource.Resource) *caches.Keyspace {
return r.(*caches.Keyspace)
}))
case resource.Metric:
metricsgen.Gen(gg, pkg, fns.Map(resources, func(r resource.Resource) *metrics.Metric {
return r.(*metrics.Metric)
}))
case resource.PubSubSubscription:
pubsubgen.Gen(gg, pkg, appDesc, fns.Map(resources, func(r resource.Resource) *pubsub.Subscription {
return r.(*pubsub.Subscription)
}))
case resource.Secrets:
svc, _ := appDesc.ServiceForPath(pkg.FSPath)
secretsgen.Gen(gg, option.AsOptional(svc), pkg, fns.Map(resources, func(r resource.Resource) *secrets.Secrets {
return r.(*secrets.Secrets)
}))
case resource.ConfigLoad:
svc, ok := appDesc.ServiceForPath(pkg.FSPath)
if !ok {
gg.Errs.Addf(resources[0].(*config.Load).AST.Pos(), "config loads must be declared in a service package")
continue
}
configgen.Gen(gg, svc, pkg, fns.Map(resources, func(r resource.Resource) *config.Load {
return r.(*config.Load)
}))
}
}
}