Skip to content

Commit 86cd0b4

Browse files
authored
breaking: pass flags as slice instead of many args (#53)
1 parent 5de3c42 commit 86cd0b4

File tree

2 files changed

+49
-52
lines changed

2 files changed

+49
-52
lines changed

internal/cmd/run.go

Lines changed: 42 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"fmt"
77
"io"
88
"os"
9+
"strings"
910

1011
"github.com/formancehq/numscript/internal/ansi"
1112
"github.com/formancehq/numscript/internal/flags"
@@ -20,17 +21,15 @@ const (
2021
OutputFormatJson = "json"
2122
)
2223

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+
}
3433

3534
type inputOpts struct {
3635
Script string `json:"script"`
@@ -39,19 +38,19 @@ type inputOpts struct {
3938
Balances interpreter.Balances `json:"balances"`
4039
}
4140

42-
func (o *inputOpts) fromRaw() {
43-
if runRawOpt == "" {
41+
func (o *inputOpts) fromRaw(opts Args) {
42+
if opts.RawOpt == "" {
4443
return
4544
}
4645

47-
err := json.Unmarshal([]byte(runRawOpt), o)
46+
err := json.Unmarshal([]byte(opts.RawOpt), o)
4847
if err != nil {
4948
panic(err)
5049
}
5150
}
5251

53-
func (o *inputOpts) fromStdin() {
54-
if !runStdinFlag {
52+
func (o *inputOpts) fromStdin(opts Args) {
53+
if !opts.StdinFlag {
5554
return
5655
}
5756

@@ -66,7 +65,7 @@ func (o *inputOpts) fromStdin() {
6665
}
6766
}
6867

69-
func (o *inputOpts) fromOptions(path string) {
68+
func (o *inputOpts) fromOptions(path string, opts Args) {
7069
if path != "" {
7170
numscriptContent, err := os.ReadFile(path)
7271
if err != nil {
@@ -76,26 +75,26 @@ func (o *inputOpts) fromOptions(path string) {
7675
o.Script = string(numscriptContent)
7776
}
7877

79-
if runBalancesOpt != "" {
80-
content, err := os.ReadFile(runBalancesOpt)
78+
if opts.BalancesOpt != "" {
79+
content, err := os.ReadFile(opts.BalancesOpt)
8180
if err != nil {
8281
os.Stderr.Write([]byte(err.Error()))
8382
return
8483
}
8584
json.Unmarshal(content, &o.Balances)
8685
}
8786

88-
if runMetaOpt != "" {
89-
content, err := os.ReadFile(runMetaOpt)
87+
if opts.MetaOpt != "" {
88+
content, err := os.ReadFile(opts.MetaOpt)
9089
if err != nil {
9190
os.Stderr.Write([]byte(err.Error()))
9291
return
9392
}
9493
json.Unmarshal(content, &o.Meta)
9594
}
9695

97-
if runVariablesOpt != "" {
98-
content, err := os.ReadFile(runVariablesOpt)
96+
if opts.VariablesOpt != "" {
97+
content, err := os.ReadFile(opts.VariablesOpt)
9998
if err != nil {
10099
os.Stderr.Write([]byte(err.Error()))
101100
return
@@ -104,16 +103,16 @@ func (o *inputOpts) fromOptions(path string) {
104103
}
105104
}
106105

107-
func run(path string) {
106+
func run(path string, opts Args) {
108107
opt := inputOpts{
109108
Variables: make(map[string]string),
110109
Meta: make(interpreter.AccountsMetadata),
111110
Balances: make(interpreter.Balances),
112111
}
113112

114-
opt.fromRaw()
115-
opt.fromOptions(path)
116-
opt.fromStdin()
113+
opt.fromRaw(opts)
114+
opt.fromOptions(path, opts)
115+
opt.fromStdin(opts)
117116

118117
parseResult := parser.Parse(opt.Script)
119118
if len(parseResult.Errors) != 0 {
@@ -122,17 +121,8 @@ func run(path string) {
122121
}
123122

124123
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{}{}
136126
}
137127

138128
result, err := interpreter.RunProgram(context.Background(), parseResult.Value, opt.Variables, interpreter.StaticStore{
@@ -151,14 +141,14 @@ func run(path string) {
151141
return
152142
}
153143

154-
switch runOutFormatOpt {
144+
switch opts.OutFormatOpt {
155145
case OutputFormatJson:
156146
showJson(result)
157147
case OutputFormatPretty:
158148
showPretty(result)
159149
default:
160150
// TODO handle err
161-
panic("Invalid option: " + runBalancesOpt)
151+
panic("Invalid option: " + opts.OutFormatOpt)
162152
}
163153

164154
}
@@ -192,6 +182,8 @@ func showPretty(result *interpreter.ExecutionResult) {
192182
}
193183

194184
func getRunCmd() *cobra.Command {
185+
opts := Args{}
186+
195187
cmd := cobra.Command{
196188
Use: "run",
197189
Short: "Evaluate a numscript file",
@@ -201,26 +193,24 @@ func getRunCmd() *cobra.Command {
201193
if len(args) > 0 {
202194
path = args[0]
203195
}
204-
run(path)
196+
run(path, opts)
205197
},
206198
}
207199

208200
// 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)")
214206

215207
// 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+
))
221211

222212
// 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.")
224214

225215
return &cmd
226216
}

internal/flags/flags.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,10 @@ const (
88
ExperimentalAccountInterpolationFlag FeatureFlag = "experimental-account-interpolation"
99
ExperimentalMidScriptFunctionCall FeatureFlag = "experimental-mid-script-function-call"
1010
)
11+
12+
var AllFlags []string = []string{
13+
ExperimentalOverdraftFunctionFeatureFlag,
14+
ExperimentalOneofFeatureFlag,
15+
ExperimentalAccountInterpolationFlag,
16+
ExperimentalMidScriptFunctionCall,
17+
}

0 commit comments

Comments
 (0)