Skip to content

Commit 96f4ad9

Browse files
authored
fix: defaultFns accept config as a parameter (#394)
1 parent 08863bf commit 96f4ad9

File tree

6 files changed

+80
-28
lines changed

6 files changed

+80
-28
lines changed

pkg/app/app.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import (
2929
)
3030

3131
func defaultFuncOrganizationSlug(engine workflow.Engine, config configuration.Configuration, logger *zerolog.Logger, apiClientFactory func(url string, client *http.Client) api.ApiClient) configuration.DefaultValueFunction {
32-
callback := func(existingValue interface{}) (interface{}, error) {
32+
callback := func(_ configuration.Configuration, existingValue interface{}) (interface{}, error) {
3333
client := engine.GetNetworkAccess().GetHttpClient()
3434
url := config.GetString(configuration.API_URL)
3535
apiClient := apiClientFactory(url, client)
@@ -47,7 +47,7 @@ func defaultFuncOrganizationSlug(engine workflow.Engine, config configuration.Co
4747
}
4848

4949
func defaultFuncOrganization(engine workflow.Engine, config configuration.Configuration, logger *zerolog.Logger, apiClientFactory func(url string, client *http.Client) api.ApiClient) configuration.DefaultValueFunction {
50-
callback := func(existingValue interface{}) (interface{}, error) {
50+
callback := func(_ configuration.Configuration, existingValue interface{}) (interface{}, error) {
5151
client := engine.GetNetworkAccess().GetHttpClient()
5252
url := config.GetString(configuration.API_URL)
5353
apiClient := apiClientFactory(url, client)
@@ -78,8 +78,8 @@ func defaultFuncOrganization(engine workflow.Engine, config configuration.Config
7878
return callback
7979
}
8080

81-
func defaultFuncApiUrl(config configuration.Configuration, logger *zerolog.Logger) configuration.DefaultValueFunction {
82-
callback := func(existingValue interface{}) (interface{}, error) {
81+
func defaultFuncApiUrl(_ configuration.Configuration, logger *zerolog.Logger) configuration.DefaultValueFunction {
82+
callback := func(config configuration.Configuration, existingValue interface{}) (interface{}, error) {
8383
urlString := constants.SNYK_DEFAULT_API_URL
8484

8585
urlFromOauthToken, err := auth.GetAudienceClaimFromOauthToken(config.GetString(auth.CONFIG_KEY_OAUTH_TOKEN))
@@ -105,7 +105,7 @@ func defaultFuncApiUrl(config configuration.Configuration, logger *zerolog.Logge
105105
}
106106

107107
func defaultInputDirectory() configuration.DefaultValueFunction {
108-
callback := func(existingValue interface{}) (interface{}, error) {
108+
callback := func(_ configuration.Configuration, existingValue interface{}) (interface{}, error) {
109109
if existingValue == nil {
110110
path, err := os.Getwd()
111111
if err != nil {
@@ -120,7 +120,7 @@ func defaultInputDirectory() configuration.DefaultValueFunction {
120120
}
121121

122122
func defaultTempDirectory(engine workflow.Engine, config configuration.Configuration, logger *zerolog.Logger) configuration.DefaultValueFunction {
123-
callback := func(existingValue interface{}) (interface{}, error) {
123+
callback := func(_ configuration.Configuration, existingValue interface{}) (interface{}, error) {
124124
version := "0.0.0"
125125
ri := engine.GetRuntimeInfo()
126126
if ri != nil && len(ri.GetVersion()) > 0 {
@@ -151,7 +151,7 @@ func defaultTempDirectory(engine workflow.Engine, config configuration.Configura
151151
}
152152

153153
func defaultPreviewFeaturesEnabled(engine workflow.Engine) configuration.DefaultValueFunction {
154-
callback := func(existingValue interface{}) (interface{}, error) {
154+
callback := func(_ configuration.Configuration, existingValue interface{}) (interface{}, error) {
155155
if existingValue != nil {
156156
return existingValue, nil
157157
}
@@ -173,7 +173,7 @@ func defaultPreviewFeaturesEnabled(engine workflow.Engine) configuration.Default
173173
}
174174

175175
func defaultMaxNetworkRetryAttempts(engine workflow.Engine) configuration.DefaultValueFunction {
176-
callback := func(existingValue interface{}) (interface{}, error) {
176+
callback := func(_ configuration.Configuration, existingValue interface{}) (interface{}, error) {
177177
const multipleAttempts = 3 // three here is chosen based on other places in the application
178178
const singleAttempt = 1
179179

@@ -219,7 +219,7 @@ func initConfiguration(engine workflow.Engine, config configuration.Configuratio
219219
config.AddDefaultValue(configuration.API_URL, defaultFuncApiUrl(config, logger))
220220
config.AddDefaultValue(configuration.TEMP_DIR_PATH, defaultTempDirectory(engine, config, logger))
221221

222-
config.AddDefaultValue(configuration.WEB_APP_URL, func(existingValue any) (any, error) {
222+
config.AddDefaultValue(configuration.WEB_APP_URL, func(_ configuration.Configuration, existingValue any) (any, error) {
223223
canonicalApiUrl := config.GetString(configuration.API_URL)
224224
appUrl, err := api.DeriveAppUrl(canonicalApiUrl)
225225
if err != nil {
@@ -232,15 +232,15 @@ func initConfiguration(engine workflow.Engine, config configuration.Configuratio
232232
config.AddDefaultValue(configuration.ORGANIZATION, defaultFuncOrganization(engine, config, logger, apiClientFactory))
233233
config.AddDefaultValue(configuration.ORGANIZATION_SLUG, defaultFuncOrganizationSlug(engine, config, logger, apiClientFactory))
234234

235-
config.AddDefaultValue(configuration.FF_OAUTH_AUTH_FLOW_ENABLED, func(existingValue any) (any, error) {
235+
config.AddDefaultValue(configuration.FF_OAUTH_AUTH_FLOW_ENABLED, func(_ configuration.Configuration, existingValue any) (any, error) {
236236
if existingValue == nil {
237237
return true, nil
238238
} else {
239239
return existingValue, nil
240240
}
241241
})
242242

243-
config.AddDefaultValue(configuration.IS_FEDRAMP, func(existingValue any) (any, error) {
243+
config.AddDefaultValue(configuration.IS_FEDRAMP, func(_ configuration.Configuration, existingValue any) (any, error) {
244244
if existingValue == nil {
245245
return api.IsFedramp(config.GetString(configuration.API_URL)), nil
246246
} else {
@@ -256,7 +256,7 @@ func initConfiguration(engine workflow.Engine, config configuration.Configuratio
256256
}
257257

258258
func customConfigFiles(config configuration.Configuration) configuration.DefaultValueFunction {
259-
return func(existingValue interface{}) (interface{}, error) {
259+
return func(_ configuration.Configuration, existingValue interface{}) (interface{}, error) {
260260
var files []string
261261
// last file usually wins if the same values are configured
262262
// Precedence should be:

pkg/configuration/configuration.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import (
2020

2121
//go:generate $GOPATH/bin/mockgen -source=configuration.go -destination ../mocks/configuration.go -package mocks -self_package github.com/snyk/go-application-framework/pkg/configuration/
2222

23-
type DefaultValueFunction func(existingValue interface{}) (interface{}, error)
23+
type DefaultValueFunction func(config Configuration, existingValue interface{}) (interface{}, error)
2424

2525
type configType string
2626
type KeyType int
@@ -107,7 +107,7 @@ type extendedViper struct {
107107

108108
// StandardDefaultValueFunction is a default value function that returns the default value if the existing value is nil.
109109
func StandardDefaultValueFunction(defaultValue interface{}) DefaultValueFunction {
110-
return func(existingValue interface{}) (interface{}, error) {
110+
return func(_ Configuration, existingValue interface{}) (interface{}, error) {
111111
if existingValue != nil {
112112
return existingValue, nil
113113
} else {
@@ -116,6 +116,13 @@ func StandardDefaultValueFunction(defaultValue interface{}) DefaultValueFunction
116116
}
117117
}
118118

119+
// ImmutableDefaultValueFunction returns a default value function that always returns the same value.
120+
func ImmutableDefaultValueFunction(defaultValue interface{}) DefaultValueFunction {
121+
return func(_ Configuration, _ interface{}) (interface{}, error) {
122+
return defaultValue, nil
123+
}
124+
}
125+
119126
// determineBasePath returns the base path for the configuration files.
120127
func determineBasePath() string {
121128
homedir, err := os.UserHomeDir()
@@ -458,7 +465,7 @@ func (ev *extendedViper) GetWithError(key string) (interface{}, error) {
458465
// if nothing was found in the cache, try to execute the default function
459466
if defaultFunc != nil {
460467
var defErr error
461-
value, defErr = defaultFunc(value)
468+
value, defErr = defaultFunc(ev, value)
462469
err = errors.Join(err, defErr)
463470

464471
// if enabled and no error occurred, store value in cache

pkg/configuration/configuration_test.go

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ func Test_ConfigurationSet_differentCases(t *testing.T) {
230230
err := config.AddFlagSet(flagset)
231231
assert.NoError(t, err)
232232
config.AddAlternativeKeys(ORGANIZATION, []string{"snyk_cfg_org"})
233-
config.AddDefaultValue(ORGANIZATION, func(existingValue interface{}) (interface{}, error) {
233+
config.AddDefaultValue(ORGANIZATION, func(_ Configuration, existingValue interface{}) (interface{}, error) {
234234
if existingValue != nil {
235235
return existingValue, nil
236236
}
@@ -396,7 +396,7 @@ func Test_DefaultValuehandling(t *testing.T) {
396396
valueExplicitlySet := "explicitly set value"
397397

398398
config := NewInMemory()
399-
config.AddDefaultValue(keyWithDefault, func(existingValue interface{}) (interface{}, error) {
399+
config.AddDefaultValue(keyWithDefault, func(_ Configuration, existingValue interface{}) (interface{}, error) {
400400
if existingValue != nil {
401401
return existingValue, nil
402402
}
@@ -434,7 +434,7 @@ func Test_DefaultValuehandling(t *testing.T) {
434434
err := config.AddFlagSet(flagset)
435435
assert.NoError(t, err)
436436
config.AddAlternativeKeys(ORGANIZATION, []string{"snyk_cfg_org"})
437-
config.AddDefaultValue(ORGANIZATION, func(existingValue interface{}) (interface{}, error) {
437+
config.AddDefaultValue(ORGANIZATION, func(_ Configuration, existingValue interface{}) (interface{}, error) {
438438
if existingValue != nil {
439439
return existingValue, nil
440440
}
@@ -564,6 +564,51 @@ func Test_Configuration_Locking(t *testing.T) {
564564
})
565565
}
566566

567+
func Test_ImmutableDefaultValueFunction(t *testing.T) {
568+
t.Run("direct function behavior", func(t *testing.T) {
569+
defaultValue := "immutable-default"
570+
fn := ImmutableDefaultValueFunction(defaultValue)
571+
572+
result, err := fn(nil, nil)
573+
assert.NoError(t, err)
574+
assert.Equal(t, defaultValue, result)
575+
576+
result, err = fn(nil, "some-existing-value")
577+
assert.NoError(t, err)
578+
assert.Equal(t, defaultValue, result)
579+
580+
result, err = fn(nil, 123)
581+
assert.NoError(t, err)
582+
assert.Equal(t, defaultValue, result)
583+
584+
result, err = fn(nil, true)
585+
assert.NoError(t, err)
586+
assert.Equal(t, defaultValue, result)
587+
})
588+
589+
t.Run("comparison with StandardDefaultValueFunction", func(t *testing.T) {
590+
standardKey := "standard-key"
591+
immutableKey := "immutable-key"
592+
defaultValue := "default"
593+
explicitValue := "explicit"
594+
595+
config := NewInMemory()
596+
config.AddDefaultValue(standardKey, StandardDefaultValueFunction(defaultValue))
597+
config.AddDefaultValue(immutableKey, ImmutableDefaultValueFunction(defaultValue))
598+
599+
assert.Equal(t, defaultValue, config.GetString(standardKey))
600+
assert.Equal(t, defaultValue, config.GetString(immutableKey))
601+
602+
config.Set(standardKey, explicitValue)
603+
config.Set(immutableKey, explicitValue)
604+
605+
// StandardDefaultValueFunction should return the explicit value
606+
assert.Equal(t, explicitValue, config.GetString(standardKey))
607+
// ImmutableDefaultValueFunction should still return the default value
608+
assert.Equal(t, defaultValue, config.GetString(immutableKey))
609+
})
610+
}
611+
567612
func Test_JsonStorage_Locking(t *testing.T) {
568613
outerConfig := NewFromFiles(TEST_FILENAME)
569614
outerConfig.PersistInStorage("n")
@@ -800,7 +845,7 @@ func Test_Configuration_caching_enabled(t *testing.T) {
800845
cacheDuration := 10 * time.Minute
801846

802847
config := NewWithOpts(WithCachingEnabled(cacheDuration))
803-
config.AddDefaultValue(myKey, func(existingValue interface{}) (interface{}, error) {
848+
config.AddDefaultValue(myKey, func(_ Configuration, existingValue interface{}) (interface{}, error) {
804849
defaultFuncCalled++
805850

806851
if existingValue != nil {

pkg/local_workflows/code_workflow.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func getSastSettings(engine workflow.Engine) (*sast_contract.SastResponse, error
6161
}
6262

6363
func getSastSettingsConfig(engine workflow.Engine) configuration.DefaultValueFunction {
64-
callback := func(existingValue interface{}) (interface{}, error) {
64+
callback := func(_ configuration.Configuration, existingValue interface{}) (interface{}, error) {
6565
if existingValue != nil {
6666
return existingValue, nil
6767
}
@@ -78,7 +78,7 @@ func getSastSettingsConfig(engine workflow.Engine) configuration.DefaultValueFun
7878
}
7979

8080
func getSastEnabled(engine workflow.Engine) configuration.DefaultValueFunction {
81-
callback := func(existingValue interface{}) (interface{}, error) {
81+
callback := func(_ configuration.Configuration, existingValue interface{}) (interface{}, error) {
8282
if existingValue != nil {
8383
return existingValue, nil
8484
}
@@ -95,7 +95,7 @@ func getSastEnabled(engine workflow.Engine) configuration.DefaultValueFunction {
9595
}
9696

9797
func getSlceEnabled(engine workflow.Engine) configuration.DefaultValueFunction {
98-
callback := func(existingValue interface{}) (interface{}, error) {
98+
callback := func(_ configuration.Configuration, existingValue interface{}) (interface{}, error) {
9999
if existingValue != nil {
100100
return existingValue, nil
101101
}

pkg/local_workflows/config_utils/feature_flag.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
func AddFeatureFlagToConfig(engine workflow.Engine, configKey string, featureFlagName string) {
1212
config := engine.GetConfiguration()
1313

14-
callback := func(existingValue interface{}) (interface{}, error) {
14+
callback := func(_ configuration.Configuration, existingValue interface{}) (interface{}, error) {
1515
if existingValue == nil {
1616
httpClient := engine.GetNetworkAccess().GetHttpClient()
1717
return GetFeatureFlagValue(featureFlagName, config, httpClient)

pkg/local_workflows/ignore_workflow/config.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,26 +18,26 @@ import (
1818
func addCreateIgnoreDefaultConfigurationValues(invocationCtx workflow.InvocationContext) {
1919
config := invocationCtx.GetConfiguration()
2020

21-
config.AddDefaultValue(RemoteRepoUrlKey, func(existingValue interface{}) (interface{}, error) {
21+
config.AddDefaultValue(RemoteRepoUrlKey, func(_ configuration.Configuration, existingValue interface{}) (interface{}, error) {
2222
return remoteRepoUrlDefaultFunc(existingValue, config)
2323
})
2424

25-
config.AddDefaultValue(IgnoreTypeKey, func(existingValue interface{}) (interface{}, error) {
25+
config.AddDefaultValue(IgnoreTypeKey, func(_ configuration.Configuration, existingValue interface{}) (interface{}, error) {
2626
isSet := config.IsSet(IgnoreTypeKey)
2727
return defaultFuncWithValidator(existingValue, isSet, isValidIgnoreType)
2828
})
2929

30-
config.AddDefaultValue(ExpirationKey, func(existingValue interface{}) (interface{}, error) {
30+
config.AddDefaultValue(ExpirationKey, func(_ configuration.Configuration, existingValue interface{}) (interface{}, error) {
3131
isSet := config.IsSet(ExpirationKey)
3232
return defaultFuncWithValidator(existingValue, isSet, isValidExpirationDate)
3333
})
3434

35-
config.AddDefaultValue(FindingsIdKey, func(existingValue interface{}) (interface{}, error) {
35+
config.AddDefaultValue(FindingsIdKey, func(_ configuration.Configuration, existingValue interface{}) (interface{}, error) {
3636
isSet := config.IsSet(FindingsIdKey)
3737
return defaultFuncWithValidator(existingValue, isSet, isValidFindingsId)
3838
})
3939

40-
config.AddDefaultValue(ReasonKey, func(existingValue interface{}) (interface{}, error) {
40+
config.AddDefaultValue(ReasonKey, func(_ configuration.Configuration, existingValue interface{}) (interface{}, error) {
4141
isSet := config.IsSet(ReasonKey)
4242
return defaultFuncWithValidator(existingValue, isSet, isValidReason)
4343
})

0 commit comments

Comments
 (0)