6
6
"fmt"
7
7
"io"
8
8
"os"
9
+ "strings"
9
10
10
11
"github.com/formancehq/numscript/internal/ansi"
11
12
"github.com/formancehq/numscript/internal/flags"
@@ -20,17 +21,15 @@ const (
20
21
OutputFormatJson = "json"
21
22
)
22
23
23
- var runVariablesOpt string
24
- var runBalancesOpt string
25
- var runMetaOpt string
26
- var runRawOpt string
27
- var runStdinFlag bool
28
- var runOutFormatOpt string
29
-
30
- var overdraftFeatureFlag bool
31
- var oneOfFeatureFlag bool
32
- var accountInterpolationFlag bool
33
- var midScriptFunctionCallFeatureFlag bool
24
+ type Args struct {
25
+ VariablesOpt string
26
+ BalancesOpt string
27
+ MetaOpt string
28
+ RawOpt string
29
+ StdinFlag bool
30
+ OutFormatOpt string
31
+ Flags []string
32
+ }
34
33
35
34
type inputOpts struct {
36
35
Script string `json:"script"`
@@ -39,19 +38,19 @@ type inputOpts struct {
39
38
Balances interpreter.Balances `json:"balances"`
40
39
}
41
40
42
- func (o * inputOpts ) fromRaw () {
43
- if runRawOpt == "" {
41
+ func (o * inputOpts ) fromRaw (opts Args ) {
42
+ if opts . RawOpt == "" {
44
43
return
45
44
}
46
45
47
- err := json .Unmarshal ([]byte (runRawOpt ), o )
46
+ err := json .Unmarshal ([]byte (opts . RawOpt ), o )
48
47
if err != nil {
49
48
panic (err )
50
49
}
51
50
}
52
51
53
- func (o * inputOpts ) fromStdin () {
54
- if ! runStdinFlag {
52
+ func (o * inputOpts ) fromStdin (opts Args ) {
53
+ if ! opts . StdinFlag {
55
54
return
56
55
}
57
56
@@ -66,7 +65,7 @@ func (o *inputOpts) fromStdin() {
66
65
}
67
66
}
68
67
69
- func (o * inputOpts ) fromOptions (path string ) {
68
+ func (o * inputOpts ) fromOptions (path string , opts Args ) {
70
69
if path != "" {
71
70
numscriptContent , err := os .ReadFile (path )
72
71
if err != nil {
@@ -76,26 +75,26 @@ func (o *inputOpts) fromOptions(path string) {
76
75
o .Script = string (numscriptContent )
77
76
}
78
77
79
- if runBalancesOpt != "" {
80
- content , err := os .ReadFile (runBalancesOpt )
78
+ if opts . BalancesOpt != "" {
79
+ content , err := os .ReadFile (opts . BalancesOpt )
81
80
if err != nil {
82
81
os .Stderr .Write ([]byte (err .Error ()))
83
82
return
84
83
}
85
84
json .Unmarshal (content , & o .Balances )
86
85
}
87
86
88
- if runMetaOpt != "" {
89
- content , err := os .ReadFile (runMetaOpt )
87
+ if opts . MetaOpt != "" {
88
+ content , err := os .ReadFile (opts . MetaOpt )
90
89
if err != nil {
91
90
os .Stderr .Write ([]byte (err .Error ()))
92
91
return
93
92
}
94
93
json .Unmarshal (content , & o .Meta )
95
94
}
96
95
97
- if runVariablesOpt != "" {
98
- content , err := os .ReadFile (runVariablesOpt )
96
+ if opts . VariablesOpt != "" {
97
+ content , err := os .ReadFile (opts . VariablesOpt )
99
98
if err != nil {
100
99
os .Stderr .Write ([]byte (err .Error ()))
101
100
return
@@ -104,16 +103,16 @@ func (o *inputOpts) fromOptions(path string) {
104
103
}
105
104
}
106
105
107
- func run (path string ) {
106
+ func run (path string , opts Args ) {
108
107
opt := inputOpts {
109
108
Variables : make (map [string ]string ),
110
109
Meta : make (interpreter.AccountsMetadata ),
111
110
Balances : make (interpreter.Balances ),
112
111
}
113
112
114
- opt .fromRaw ()
115
- opt .fromOptions (path )
116
- opt .fromStdin ()
113
+ opt .fromRaw (opts )
114
+ opt .fromOptions (path , opts )
115
+ opt .fromStdin (opts )
117
116
118
117
parseResult := parser .Parse (opt .Script )
119
118
if len (parseResult .Errors ) != 0 {
@@ -122,17 +121,8 @@ func run(path string) {
122
121
}
123
122
124
123
featureFlags := map [string ]struct {}{}
125
- if overdraftFeatureFlag {
126
- featureFlags [flags .ExperimentalOverdraftFunctionFeatureFlag ] = struct {}{}
127
- }
128
- if oneOfFeatureFlag {
129
- featureFlags [flags .ExperimentalOneofFeatureFlag ] = struct {}{}
130
- }
131
- if accountInterpolationFlag {
132
- featureFlags [flags .ExperimentalAccountInterpolationFlag ] = struct {}{}
133
- }
134
- if midScriptFunctionCallFeatureFlag {
135
- featureFlags [flags .ExperimentalMidScriptFunctionCall ] = struct {}{}
124
+ for _ , flag := range opts .Flags {
125
+ featureFlags [flag ] = struct {}{}
136
126
}
137
127
138
128
result , err := interpreter .RunProgram (context .Background (), parseResult .Value , opt .Variables , interpreter.StaticStore {
@@ -151,14 +141,14 @@ func run(path string) {
151
141
return
152
142
}
153
143
154
- switch runOutFormatOpt {
144
+ switch opts . OutFormatOpt {
155
145
case OutputFormatJson :
156
146
showJson (result )
157
147
case OutputFormatPretty :
158
148
showPretty (result )
159
149
default :
160
150
// TODO handle err
161
- panic ("Invalid option: " + runBalancesOpt )
151
+ panic ("Invalid option: " + opts . OutFormatOpt )
162
152
}
163
153
164
154
}
@@ -192,6 +182,8 @@ func showPretty(result *interpreter.ExecutionResult) {
192
182
}
193
183
194
184
func getRunCmd () * cobra.Command {
185
+ opts := Args {}
186
+
195
187
cmd := cobra.Command {
196
188
Use : "run" ,
197
189
Short : "Evaluate a numscript file" ,
@@ -201,26 +193,24 @@ func getRunCmd() *cobra.Command {
201
193
if len (args ) > 0 {
202
194
path = args [0 ]
203
195
}
204
- run (path )
196
+ run (path , opts )
205
197
},
206
198
}
207
199
208
200
// Input args
209
- cmd .Flags ().StringVarP (& runVariablesOpt , "variables" , "v" , "" , "Path of a json file containing the variables" )
210
- cmd .Flags ().StringVarP (& runBalancesOpt , "balances" , "b" , "" , "Path of a json file containing the balances" )
211
- cmd .Flags ().StringVarP (& runMetaOpt , "meta" , "m" , "" , "Path of a json file containing the accounts metadata" )
212
- cmd .Flags ().StringVarP (& runRawOpt , "raw" , "r" , "" , "Raw json input containing script, variables, balances, metadata" )
213
- cmd .Flags ().BoolVar (& runStdinFlag , "stdin" , false , "Take input from stdin (same format as the --raw option)" )
201
+ cmd .Flags ().StringVarP (& opts . VariablesOpt , "variables" , "v" , "" , "Path of a json file containing the variables" )
202
+ cmd .Flags ().StringVarP (& opts . BalancesOpt , "balances" , "b" , "" , "Path of a json file containing the balances" )
203
+ cmd .Flags ().StringVarP (& opts . MetaOpt , "meta" , "m" , "" , "Path of a json file containing the accounts metadata" )
204
+ cmd .Flags ().StringVarP (& opts . RawOpt , "raw" , "r" , "" , "Raw json input containing script, variables, balances, metadata" )
205
+ cmd .Flags ().BoolVar (& opts . StdinFlag , "stdin" , false , "Take input from stdin (same format as the --raw option)" )
214
206
215
207
// Feature flag
216
-
217
- cmd .Flags ().BoolVar (& overdraftFeatureFlag , flags .ExperimentalOverdraftFunctionFeatureFlag , false , "enables the experimental overdraft() function" )
218
- cmd .Flags ().BoolVar (& oneOfFeatureFlag , flags .ExperimentalOneofFeatureFlag , false , "enable the experimental oneof combinator" )
219
- cmd .Flags ().BoolVar (& accountInterpolationFlag , flags .ExperimentalAccountInterpolationFlag , false , "enables an account interpolation syntax, e.g. @users:$id:pending" )
220
- cmd .Flags ().BoolVar (& midScriptFunctionCallFeatureFlag , flags .ExperimentalMidScriptFunctionCall , false , "allows to use function call as expression, and to use any expression when definining variables" )
208
+ cmd .Flags ().StringSliceVar (& opts .Flags , "flags" , nil , fmt .Sprintf ("the feature flags to pass to the interpreter. Currently available flags: %s" ,
209
+ strings .Join (flags .AllFlags , ", " ),
210
+ ))
221
211
222
212
// Output options
223
- cmd .Flags ().StringVar (& runOutFormatOpt , "output-format" , OutputFormatPretty , "Set the output format. Available options: pretty, json." )
213
+ cmd .Flags ().StringVar (& opts . OutFormatOpt , "output-format" , OutputFormatPretty , "Set the output format. Available options: pretty, json." )
224
214
225
215
return & cmd
226
216
}
0 commit comments