-
Notifications
You must be signed in to change notification settings - Fork 172
/
Copy pathjsonnet.go
96 lines (77 loc) · 2.44 KB
/
jsonnet.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
package main
import (
"encoding/json"
"fmt"
"log"
"strings"
"github.com/go-clix/cli"
"github.com/spf13/pflag"
"github.com/grafana/tanka/pkg/tanka"
)
func evalCmd() *cli.Command {
cmd := &cli.Command{
Short: "evaluate the jsonnet to json",
Use: "eval <path>",
Args: workflowArgs,
}
evalPattern := cmd.Flags().StringP("eval", "e", "", "Evaluate expression on output of jsonnet")
getJsonnetOpts := jsonnetFlags(cmd.Flags())
cmd.Run = func(cmd *cli.Command, args []string) error {
jsonnetOpts := tanka.Opts{
JsonnetOpts: getJsonnetOpts(),
}
jsonnetOpts.EvalPattern = *evalPattern
raw, err := tanka.Eval(args[0], jsonnetOpts)
if raw == nil && err != nil {
return err
}
out, err := json.MarshalIndent(raw, "", " ")
if err != nil {
return err
}
if err := pageln(string(out)); err != nil {
return err
}
return nil
}
return cmd
}
func jsonnetFlags(fs *pflag.FlagSet) func() tanka.JsonnetOpts {
getExtCode, getTLACode := cliCodeParser(fs)
return func() tanka.JsonnetOpts {
return tanka.JsonnetOpts{
ExtCode: getExtCode(),
TLACode: getTLACode(),
}
}
}
func cliCodeParser(fs *pflag.FlagSet) (func() map[string]string, func() map[string]string) {
// need to use StringArray instead of StringSlice, because pflag attempts to
// parse StringSlice using the csv parser, which breaks when passing objects
extCode := fs.StringArray("ext-code", nil, "Set code value of extVar (Format: key=<code>)")
extStr := fs.StringArrayP("ext-str", "V", nil, "Set string value of extVar (Format: key=value)")
tlaCode := fs.StringArray("tla-code", nil, "Set code value of top level function (Format: key=<code>)")
tlaStr := fs.StringArrayP("tla-str", "A", nil, "Set string value of top level function (Format: key=value)")
newParser := func(kind string, code, str *[]string) func() map[string]string {
return func() map[string]string {
m := make(map[string]string)
for _, s := range *code {
split := strings.SplitN(s, "=", 2)
if len(split) != 2 {
log.Fatalf(kind+"-code argument has wrong format: `%s`. Expected `key=<code>`", s)
}
m[split[0]] = split[1]
}
for _, s := range *str {
split := strings.SplitN(s, "=", 2)
if len(split) != 2 {
log.Fatalf(kind+"-str argument has wrong format: `%s`. Expected `key=<value>`", s)
}
m[split[0]] = fmt.Sprintf(`"%s"`, split[1])
}
return m
}
}
return newParser("ext", extCode, extStr),
newParser("tla", tlaCode, tlaStr)
}