diff --git a/config/config.go b/config/config.go index afa0866cb..4adbc8b75 100644 --- a/config/config.go +++ b/config/config.go @@ -1025,6 +1025,7 @@ func parseConfig(contents []byte) (*ast.Table, error) { contents = trimBOM(contents) parameters := envVarRe.FindAllSubmatch(contents, -1) + var missingEnvVars []string for _, parameter := range parameters { if len(parameter) != 3 { continue @@ -1043,9 +1044,21 @@ func parseConfig(contents []byte) (*ast.Table, error) { if ok { envVal = escapeEnv(envVal) contents = bytes.Replace(contents, parameter[0], []byte(envVal), 1) + } else { + missingEnvVars = append(missingEnvVars, string(envVar)) } } + // Report all missing environment variables to the user + if len(missingEnvVars) > 0 { + errorMsg := "environment variable(s) not set:" + for _, e := range missingEnvVars { + errorMsg += e + " " + } + + return nil, fmt.Errorf(errorMsg) + } + return toml.Parse(contents) } diff --git a/config/config_test.go b/config/config_test.go index 5a64cabca..0face446d 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -264,13 +264,15 @@ func TestConfig_WrongFieldType(t *testing.T) { func TestConfig_InlineTables(t *testing.T) { // #4098 c := NewConfig() + require.NoError(t, os.Setenv("TOKEN", "test")) require.NoError(t, c.LoadConfig("./testdata/inline_table.toml")) require.Len(t, c.Outputs, 2) output, ok := c.Outputs[1].Output.(*MockupOuputPlugin) require.True(t, ok) - require.Equal(t, map[string]string{"Authorization": "Token $TOKEN", "Content-Type": "application/json"}, output.Headers) + require.Equal(t, map[string]string{"Authorization": "Token test", "Content-Type": "application/json"}, output.Headers) require.Equal(t, []string{"org_id"}, c.Outputs[0].Config.Filter.TagInclude) + require.NoError(t, os.Unsetenv("TOKEN")) } func TestConfig_SliceComment(t *testing.T) {