Add new method Encode to Viper that allows loading rawVal into config and merging it with the current config map

This commit is contained in:
Nobi 2023-07-25 22:43:18 +07:00
parent b210eb7dcd
commit e648540a6a
No known key found for this signature in database
GPG key ID: 6BEC04F94F08661F
3 changed files with 40 additions and 0 deletions

View file

@ -1704,6 +1704,16 @@ func (v *Viper) SafeWriteConfigAs(filename string) error {
return v.writeConfig(filename, false) return v.writeConfig(filename, false)
} }
// Encode will load the rawVal into config, then you can write to file
func (v *Viper) Encode(rawVal interface{}, opts ...DecoderConfigOption) error {
var cfg map[string]interface{}
err := decode(rawVal, defaultDecoderConfig(&cfg, opts...))
if err != nil {
return err
}
return v.MergeConfigMap(cfg)
}
// Marshal will return a Buffer containing the content that should have been written to the file // Marshal will return a Buffer containing the content that should have been written to the file
func (v *Viper) Marshal() (*bytes.Buffer, error) { func (v *Viper) Marshal() (*bytes.Buffer, error) {
data, err := v.encoderRegistry.Encode(v.getConfigType(), v.AllSettings()) data, err := v.encoderRegistry.Encode(v.getConfigType(), v.AllSettings())

View file

@ -1979,6 +1979,18 @@ func TestSafeWriteConfigAsWithExistingFile(t *testing.T) {
assert.True(t, ok, "Expected ConfigFileAlreadyExistsError") assert.True(t, ok, "Expected ConfigFileAlreadyExistsError")
} }
func TestEncode(t *testing.T) {
type config struct {
Age int
Beard bool
}
C := &config{35, true}
v := New()
require.NoError(t, v.Encode(C))
expected := map[string]interface{}{"age": 35, "beard": true}
assert.Equal(t, v.config, expected)
}
func TestMarshal(t *testing.T) { func TestMarshal(t *testing.T) {
v := New() v := New()
v.SetConfigType("yaml") v.SetConfigType("yaml")
@ -1988,6 +2000,20 @@ func TestMarshal(t *testing.T) {
assert.Equal(t, c.Bytes(), yamlWriteExpected) assert.Equal(t, c.Bytes(), yamlWriteExpected)
} }
func TestEncodeAndMarshal(t *testing.T) {
type config struct {
Age int
Beard bool
}
C := &config{35, true}
v := New()
require.NoError(t, v.Encode(C))
v.SetConfigType("yaml")
c, err := v.Marshal()
require.NoError(t, err)
assert.Equal(t, c.Bytes(), yamlEncodeWriteExpected)
}
func TestWriteHiddenFile(t *testing.T) { func TestWriteHiddenFile(t *testing.T) {
v := New() v := New()
fs := afero.NewMemMapFs() fs := afero.NewMemMapFs()

View file

@ -51,3 +51,7 @@ emails:
created: 01/02/03 created: 01/02/03
active: true active: true
`) `)
var yamlEncodeWriteExpected = []byte(`age: 35
beard: true
`)