Description
Preflight Checklist
- I have searched the issue tracker for an issue that matches the one I want to file, without success.
- I am not looking for support or already pursued the available support channels without success.
- I have checked the troubleshooting guide for my problem, without success.
Viper Version
1.12.2
Go Version
1.22.1
Config Source
Environment variables, Files
Format
JSON
Repl.it link
No response
Code reproducing the issue
package config
import (
"bytes"
"os"
"strings"
"testing"
"github.com/mitchellh/mapstructure"
"github.com/spf13/viper"
"github.com/stretchr/testify/require"
)
type MapData struct {
Enabled bool `json:"enabled" mapstructure:"enabled"`
}
type Config struct {
MapData map[string]MapData `json:"map_data" mapstructure:"map_data"`
}
var jsonData = []byte(`{
"map_data": {
"first": {
"enabled": false
},
"second": {
"enabled": true
}
}
}`)
func TestSetup(t *testing.T) {
os.Setenv("EXAMPLE_MAP_DATA_FIRST_ENABLED", "true")
defer os.Unsetenv("EXAMPLE_MAP_DATA_FIRST_ENABLED")
os.Setenv("EXAMPLE_MAP_DATA_SECOND_ENABLED", "false")
defer os.Unsetenv("EXAMPLE_MAP_DATA_SECOND_ENABLED")
viper.SetConfigType("json")
viper.ReadConfig(bytes.NewBuffer(jsonData))
viper.SetTypeByDefaultValue(true)
viper.SetEnvPrefix("example")
viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_", "-", "_"))
viper.AutomaticEnv()
var data Config
err := viper.Unmarshal(&data, viper.DecodeHook(
mapstructure.ComposeDecodeHookFunc(
mapstructure.TextUnmarshallerHookFunc(),
mapstructure.StringToTimeDurationHookFunc(),
mapstructure.StringToSliceHookFunc(","),
),
))
require.NoError(t, err)
require.NotNil(t, data.MapData["first"]) // This will not fail, it is getting from the json file
require.NotNil(t, data.MapData["second"]) // This will not fail, it is getting from the json file
require.True(t, data.MapData["first"].Enabled) // This will fail
require.False(t, data.MapData["second"].Enabled) // This will fail
}
Expected Behavior
It should be possible to bind map values through environment variables.
Actual Behavior
The environment variable is not considered.
Steps To Reproduce
Execute the code I provided.
Additional Information
When coding this, I thought it would be hard for Viper to consider this complex structure. How will the code know the map's key from the environment variable? Maybe it should have a specific separator for map keys? Like EXAMPLE_MAP_DATA__FIRST__ENABLED
instead of EXAMPLE_MAP_DATA_FIRST_ENABLED
? I don't know if I'm doing something wrong here.
I didn't manage to create a new map key from an environment variable. I think the documentation for environment variables when using maps, slices, etc is kind of outdated and must be updated. I'm doing trial-error for several minutes trying to make this work and I don't have any idea if I'm in the right direction.
Activity