Skip to content

Commit d204e8a

Browse files
committed
Chore: Refactor lib.RuntimeOptions load
1 parent dafd7f8 commit d204e8a

File tree

1 file changed

+60
-46
lines changed

1 file changed

+60
-46
lines changed

internal/cmd/runtime_options.go

+60-46
Original file line numberDiff line numberDiff line change
@@ -41,25 +41,35 @@ extended: base + sets "global" as alias for "globalThis"
4141
return flags
4242
}
4343

44-
func saveBoolFromEnv(env map[string]string, varName string, placeholder *null.Bool) error {
45-
strValue, ok := env[varName]
46-
if !ok {
47-
return nil
44+
func getRuntimeOptions(
45+
flags *pflag.FlagSet,
46+
environment map[string]string,
47+
) (lib.RuntimeOptions, error) {
48+
// TODO: refactor with composable helpers as a part of #883, to reduce copy-paste
49+
// TODO: get these options out of the JSON config file as well?
50+
opts, err := populateRuntimeOptionsFromEnv(runtimeOptionsFromFlags(flags), environment)
51+
if err != nil {
52+
return opts, err
4853
}
49-
val, err := strconv.ParseBool(strValue)
54+
55+
// Set/overwrite environment variables with custom user-supplied values
56+
envVars, err := flags.GetStringArray("env")
5057
if err != nil {
51-
return fmt.Errorf("env var '%s' is not a valid boolean value: %w", varName, err)
58+
return opts, err
5259
}
53-
// Only override if not explicitly set via the CLI flag
54-
if !placeholder.Valid {
55-
*placeholder = null.BoolFrom(val)
60+
for _, kv := range envVars {
61+
k, v := state.ParseEnvKeyValue(kv)
62+
// Allow only alphanumeric ASCII variable names for now
63+
if !userEnvVarName.MatchString(k) {
64+
return opts, fmt.Errorf("invalid environment variable name '%s'", k)
65+
}
66+
opts.Env[k] = v
5667
}
57-
return nil
68+
69+
return opts, nil
5870
}
5971

60-
func getRuntimeOptions(flags *pflag.FlagSet, environment map[string]string) (lib.RuntimeOptions, error) {
61-
// TODO: refactor with composable helpers as a part of #883, to reduce copy-paste
62-
// TODO: get these options out of the JSON config file as well?
72+
func runtimeOptionsFromFlags(flags *pflag.FlagSet) lib.RuntimeOptions {
6373
opts := lib.RuntimeOptions{
6474
TestType: getNullString(flags, "type"),
6575
IncludeSystemEnvVars: getNullBool(flags, "include-system-env-vars"),
@@ -70,65 +80,69 @@ func getRuntimeOptions(flags *pflag.FlagSet, environment map[string]string) (lib
7080
TracesOutput: getNullString(flags, "traces-output"),
7181
Env: make(map[string]string),
7282
}
83+
return opts
84+
}
7385

74-
if envVar, ok := environment["K6_TYPE"]; ok && !opts.TestType.Valid {
75-
// Only override if not explicitly set via the CLI flag
86+
func populateRuntimeOptionsFromEnv(opts lib.RuntimeOptions, environment map[string]string) (lib.RuntimeOptions, error) {
87+
// Only override if not explicitly set via the CLI flag
88+
89+
if envVar, ok := environment["K6_TYPE"]; !opts.TestType.Valid && ok {
7690
opts.TestType = null.StringFrom(envVar)
7791
}
78-
if envVar, ok := environment["K6_COMPATIBILITY_MODE"]; ok && !opts.CompatibilityMode.Valid {
79-
// Only override if not explicitly set via the CLI flag
92+
93+
if envVar, ok := environment["K6_COMPATIBILITY_MODE"]; !opts.CompatibilityMode.Valid && ok {
8094
opts.CompatibilityMode = null.StringFrom(envVar)
8195
}
82-
if _, err := lib.ValidateCompatibilityMode(opts.CompatibilityMode.String); err != nil {
83-
// some early validation
84-
return opts, err
85-
}
8696

8797
if err := saveBoolFromEnv(environment, "K6_INCLUDE_SYSTEM_ENV_VARS", &opts.IncludeSystemEnvVars); err != nil {
8898
return opts, err
8999
}
100+
90101
if err := saveBoolFromEnv(environment, "K6_NO_THRESHOLDS", &opts.NoThresholds); err != nil {
91102
return opts, err
92103
}
104+
93105
if err := saveBoolFromEnv(environment, "K6_NO_SUMMARY", &opts.NoSummary); err != nil {
94106
return opts, err
95107
}
96108

97-
if envVar, ok := environment["K6_SUMMARY_EXPORT"]; ok {
98-
if !opts.SummaryExport.Valid {
99-
opts.SummaryExport = null.StringFrom(envVar)
100-
}
109+
if _, err := lib.ValidateCompatibilityMode(opts.CompatibilityMode.String); err != nil {
110+
// some early validation
111+
return opts, err
101112
}
102113

103-
if envVar, ok := environment["SSLKEYLOGFILE"]; ok {
104-
if !opts.KeyWriter.Valid {
105-
opts.KeyWriter = null.StringFrom(envVar)
106-
}
114+
if envVar, ok := environment["K6_SUMMARY_EXPORT"]; !opts.SummaryExport.Valid && ok {
115+
opts.SummaryExport = null.StringFrom(envVar)
107116
}
108117

109-
if envVar, ok := environment["K6_TRACES_OUTPUT"]; ok {
110-
if !opts.TracesOutput.Valid {
111-
opts.TracesOutput = null.StringFrom(envVar)
112-
}
118+
if envVar, ok := environment["SSLKEYLOGFILE"]; !opts.KeyWriter.Valid && ok {
119+
opts.KeyWriter = null.StringFrom(envVar)
120+
}
121+
122+
if envVar, ok := environment["K6_TRACES_OUTPUT"]; !opts.TracesOutput.Valid && ok {
123+
opts.TracesOutput = null.StringFrom(envVar)
113124
}
114125

115-
if opts.IncludeSystemEnvVars.Bool { // If enabled, gather the actual system environment variables
126+
// If enabled, gather the actual system environment variables
127+
if opts.IncludeSystemEnvVars.Bool {
116128
opts.Env = environment
117129
}
118130

119-
// Set/overwrite environment variables with custom user-supplied values
120-
envVars, err := flags.GetStringArray("env")
131+
return opts, nil
132+
}
133+
134+
func saveBoolFromEnv(env map[string]string, varName string, placeholder *null.Bool) error {
135+
strValue, ok := env[varName]
136+
if !ok {
137+
return nil
138+
}
139+
val, err := strconv.ParseBool(strValue)
121140
if err != nil {
122-
return opts, err
141+
return fmt.Errorf("env var '%s' is not a valid boolean value: %w", varName, err)
123142
}
124-
for _, kv := range envVars {
125-
k, v := state.ParseEnvKeyValue(kv)
126-
// Allow only alphanumeric ASCII variable names for now
127-
if !userEnvVarName.MatchString(k) {
128-
return opts, fmt.Errorf("invalid environment variable name '%s'", k)
129-
}
130-
opts.Env[k] = v
143+
// Only override if not explicitly set via the CLI flag
144+
if !placeholder.Valid {
145+
*placeholder = null.BoolFrom(val)
131146
}
132-
133-
return opts, nil
147+
return nil
134148
}

0 commit comments

Comments
 (0)