@@ -60,17 +60,30 @@ var Command = cli.Command{
60
60
}
61
61
62
62
func generate (c * cli.Context ) error {
63
- source := c .String ("source" )
63
+ result , err := convert (c .String ("source" ), c .Bool ("string" ), c .Bool ("format" ), c .Bool ("stream" ), c .StringSlice ("extVar" ))
64
+ if err != nil {
65
+ return err
66
+ }
67
+
68
+ // the user can optionally write the yaml to stdout. This is useful for debugging purposes without mutating an existing file.
69
+ if c .Bool ("stdout" ) {
70
+ io .WriteString (os .Stdout , result )
71
+ return nil
72
+ }
73
+
64
74
target := c .String ("target" )
75
+ return ioutil .WriteFile (target , []byte (result ), 0644 )
76
+ }
65
77
78
+ func convert (source string , stringOutput bool , format bool , stream bool , vars []string ) (string , error ) {
66
79
data , err := ioutil .ReadFile (source )
67
80
if err != nil {
68
- return err
81
+ return "" , err
69
82
}
70
83
71
84
vm := jsonnet .MakeVM ()
72
85
vm .MaxStack = 500
73
- vm .StringOutput = c . Bool ( "string" )
86
+ vm .StringOutput = stringOutput
74
87
vm .ErrorFormatter .SetMaxStackTraceSize (20 )
75
88
vm .ErrorFormatter .SetColorFormatter (
76
89
color .New (color .FgRed ).Fprintf ,
@@ -80,49 +93,55 @@ func generate(c *cli.Context) error {
80
93
RegisterNativeFuncs (vm )
81
94
82
95
// extVars
83
- vars := c .StringSlice ("extVar" )
84
96
for _ , v := range vars {
85
97
name , value , err := getVarVal (v )
86
98
if err != nil {
87
- return err
99
+ return "" , err
88
100
}
89
101
vm .ExtVar (name , value )
90
102
}
91
103
104
+ formatDoc := func (doc []byte ) ([]byte , error ) {
105
+ // enable yaml output
106
+ if format {
107
+ formatted , yErr := yaml .JSONToYAML (doc )
108
+ if yErr != nil {
109
+ return nil , fmt .Errorf ("failed to convert to YAML: %v" , yErr )
110
+ }
111
+ return formatted , nil
112
+ }
113
+ return doc , nil
114
+ }
115
+
92
116
buf := new (bytes.Buffer )
93
- if c . Bool ( " stream" ) {
117
+ if stream {
94
118
docs , err := vm .EvaluateSnippetStream (source , string (data ))
95
119
if err != nil {
96
- return err
120
+ return "" , err
97
121
}
98
122
for _ , doc := range docs {
123
+ formatted , err := formatDoc ([]byte (doc ))
124
+ if err != nil {
125
+ return "" , err
126
+ }
127
+
99
128
buf .WriteString ("---" )
100
129
buf .WriteString ("\n " )
101
- buf .WriteString ( doc )
130
+ buf .Write ( formatted )
102
131
}
103
132
} else {
104
133
result , err := vm .EvaluateSnippet (source , string (data ))
105
134
if err != nil {
106
- return err
135
+ return "" , err
107
136
}
108
- buf .WriteString (result )
109
- }
110
- // enable yaml output
111
- if c .Bool ("format" ) {
112
- formatted , yErr := yaml .JSONToYAML (buf .Bytes ())
113
- if yErr != nil {
114
- return fmt .Errorf ("failed to convert to YAML: %v" , yErr )
137
+ formatted , err := formatDoc ([]byte (result ))
138
+ if err != nil {
139
+ return "" , err
115
140
}
116
- buf .Reset ()
117
141
buf .Write (formatted )
118
142
}
119
- // the user can optionally write the yaml to stdout. This is useful for debugging purposes without mutating an existing file.
120
- if c .Bool ("stdout" ) {
121
- io .Copy (os .Stdout , buf )
122
- return nil
123
- }
124
143
125
- return ioutil . WriteFile ( target , buf .Bytes (), 0644 )
144
+ return buf .String (), nil
126
145
}
127
146
128
147
// https://github.com/google/go-jsonnet/blob/master/cmd/jsonnet/cmd.go#L149
0 commit comments