/
templates.go
76 lines (65 loc) · 1.76 KB
/
templates.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
package transforms
import (
"fmt"
"sort"
"github.com/anz-bank/sysl/pkg/eval"
"github.com/anz-bank/sysl/pkg/sysl"
"github.com/sirupsen/logrus"
)
type templated struct {
base
}
func (t *templated) Apply(mod *sysl.Module, appNames ...string) map[string]*sysl.Value {
input := eval.Scope{}
input.AddModule("Module", mod)
apps := eval.MakeValueList()
var aNames []string
if len(appNames) == 0 {
for app := range mod.Apps {
aNames = append(aNames, app)
}
} else {
aNames = append(aNames, appNames...)
}
sort.Strings(aNames)
for _, app := range aNames {
s := eval.Scope{}
s.AddApp(app, mod.Apps[app])
eval.AppendItemToValueList(apps.GetList(), s[app])
}
input["Apps"] = apps
s := eval.Scope{}
s[t.view.Param[0].Name] = input.ToValue()
evalRes := t.eval(t.view, s)
logrus.Tracef("Apply evalRes: %s", evalRes.String())
fn := func(v *sysl.Value) (filename string, data string, err error) {
valMap := v.GetMap().Items["apps"].GetSet().Value[0].GetMap().Items["app"].GetMap()
if valMap == nil {
return "", "", fmt.Errorf("incorrect return type")
}
val, ok := valMap.Items["Filename"]
if !ok {
return "", "", fmt.Errorf("'Filename' not set")
}
filename = val.GetS()
val, ok = valMap.Items["Data"]
if !ok {
return "", "", fmt.Errorf("'Data' not set")
}
data = eval.UnaryString(val).GetS()
return
}
result := map[string]*sysl.Value{}
if evalRes.GetList() != nil {
for _, val := range evalRes.GetList().Value {
if fname, data, err := fn(val); err == nil {
result[fname] = eval.MakeValueString(data)
}
}
} else if fname, data, err := fn(evalRes); err == nil {
result[fname] = eval.MakeValueString(data)
}
logrus.Tracef("Apply result: %+v", result)
return result
}
const templateInputType = "sysl.TemplateInput"