Skip to content

Commit a70d3ee

Browse files
committed
refactor: use experiment.Experiment type as experiments map key
Use the stricter experiment.Experiment type instead of string for the internal Config.experiments map key to improve type safety.
1 parent 47f6207 commit a70d3ee

2 files changed

Lines changed: 23 additions & 13 deletions

File tree

internal/config/config.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package config
1616

1717
import (
18+
"github.com/slackapi/slack-cli/internal/experiment"
1819
"github.com/slackapi/slack-cli/internal/shared/types"
1920
"github.com/spf13/afero"
2021
"github.com/spf13/pflag"
@@ -62,7 +63,7 @@ type Config struct {
6263

6364
// Feature experiments
6465
ExperimentsFlag []string
65-
experiments map[string]bool
66+
experiments map[experiment.Experiment]bool
6667

6768
// Eventually this will also load the global and project slack config files
6869
DomainAuthTokens string

internal/config/experiments.go

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,37 +31,37 @@ func (c *Config) LoadExperiments(
3131
ctx context.Context,
3232
printDebug func(ctx context.Context, format string, a ...interface{}),
3333
) {
34-
experiments := map[string]bool{}
34+
experiments := map[experiment.Experiment]bool{}
3535
// Load from flags
3636
for _, flagValue := range c.ExperimentsFlag {
37-
experiments[flagValue] = true
37+
experiments[experiment.Experiment(flagValue)] = true
3838
}
3939
printDebug(ctx, fmt.Sprintf("active flag experiments: %s", formatExperimentMap(experiments)))
4040
// Load from project config file
4141
projectConfig, err := ReadProjectConfigFile(ctx, c.fs, c.os)
4242
if err != nil && slackerror.ToSlackError(err).Code != slackerror.ErrInvalidAppDirectory {
4343
printDebug(ctx, fmt.Sprintf("failed to parse project-level config file: %s", err))
4444
} else if err == nil {
45-
printDebug(ctx, fmt.Sprintf("active project experiments: %s", formatExperimentMap(projectConfig.Experiments)))
46-
maps.Copy(experiments, projectConfig.Experiments)
45+
printDebug(ctx, fmt.Sprintf("active project experiments: %s", formatExperimentMap(toExperimentMap(projectConfig.Experiments))))
46+
maps.Copy(experiments, toExperimentMap(projectConfig.Experiments))
4747
}
4848
// Load from system config file
4949
userConfig, err := c.SystemConfig.UserConfig(ctx)
5050
if err != nil {
5151
printDebug(ctx, fmt.Sprintf("failed to parse system-level config file: %s", err))
5252
} else {
53-
printDebug(ctx, fmt.Sprintf("active system experiments: %s", formatExperimentMap(userConfig.Experiments)))
54-
maps.Copy(experiments, userConfig.Experiments)
53+
printDebug(ctx, fmt.Sprintf("active system experiments: %s", formatExperimentMap(toExperimentMap(userConfig.Experiments))))
54+
maps.Copy(experiments, toExperimentMap(userConfig.Experiments))
5555
}
5656
// Load from permanently enabled list
5757
for _, exp := range experiment.EnabledExperiments {
58-
experiments[string(exp)] = true
58+
experiments[exp] = true
5959
}
6060
printDebug(ctx, fmt.Sprintf("active permanently enabled experiments: %s", experiment.EnabledExperiments))
6161
// Audit the experiments
6262
c.experiments = experiments
6363
for name := range c.experiments {
64-
if !experiment.Includes(experiment.Experiment(name)) {
64+
if !experiment.Includes(name) {
6565
printDebug(ctx, fmt.Sprintf("invalid experiment found: %s", name))
6666
}
6767
}
@@ -72,7 +72,7 @@ func (c *Config) GetExperiments() []experiment.Experiment {
7272
result := make([]experiment.Experiment, 0, len(c.experiments))
7373
for name, enabled := range c.experiments {
7474
if enabled {
75-
result = append(result, experiment.Experiment(name))
75+
result = append(result, name)
7676
}
7777
}
7878
sort.Slice(result, func(i, j int) bool {
@@ -83,19 +83,28 @@ func (c *Config) GetExperiments() []experiment.Experiment {
8383

8484
// WithExperimentOn checks whether an experiment is currently toggled on
8585
func (c *Config) WithExperimentOn(experimentToCheck experiment.Experiment) bool {
86-
return c.experiments[string(experimentToCheck)]
86+
return c.experiments[experimentToCheck]
87+
}
88+
89+
// toExperimentMap converts a map[string]bool to map[experiment.Experiment]bool
90+
func toExperimentMap(m map[string]bool) map[experiment.Experiment]bool {
91+
result := make(map[experiment.Experiment]bool, len(m))
92+
for name, enabled := range m {
93+
result[experiment.Experiment(name)] = enabled
94+
}
95+
return result
8796
}
8897

8998
// formatExperimentMap returns a string representation of the experiments map
9099
// for debug logging, formatted similar to the old slice format.
91-
func formatExperimentMap(m map[string]bool) string {
100+
func formatExperimentMap(m map[experiment.Experiment]bool) string {
92101
if len(m) == 0 {
93102
return "[]"
94103
}
95104
names := make([]string, 0, len(m))
96105
for name, enabled := range m {
97106
if enabled {
98-
names = append(names, name)
107+
names = append(names, string(name))
99108
}
100109
}
101110
sort.Strings(names)

0 commit comments

Comments
 (0)