Proper interface value obtaining and more tests.

This commit is contained in:
Stanislav Nikitin 2019-09-18 14:53:58 +05:00
parent e34e443897
commit 448edf8970
No known key found for this signature in database
GPG Key ID: 106900B32F8192EE
2 changed files with 34 additions and 3 deletions

View File

@ -25,9 +25,13 @@ func composeTree(value reflect.Value, prefix string) {
// If currently processed field - interface, then we should
// get underlying value.
//if fieldToProcess.Kind() == reflect.Interface {
// fieldToProcess = fieldToProcess.Elem()
//}
if fieldToProcess.Kind() == reflect.Interface {
if fieldToProcess.Elem().Kind() == reflect.Ptr {
fieldToProcess = fieldToProcess.Elem().Elem()
} else if fieldToProcess.Elem().Kind() == reflect.Struct {
fieldToProcess = fieldToProcess.Elem()
}
}
// In 99% of cases we will get uninitialized things we should
// initialize.

View File

@ -766,3 +766,30 @@ func TestParseStructWithInterfaceFields(t *testing.T) {
os.Unsetenv("DATA")
os.Unsetenv(debugFlagEnvName)
}
func TestParseStructWitStructAsInterface(t *testing.T) {
type testStruct struct {
Data interface{}
Int int
}
type testUnderlyingStruct struct {
Data string
}
os.Setenv(debugFlagEnvName, "true")
os.Setenv("INT", "64")
os.Setenv("DATA_DATA", "Test data")
testCase := &testStruct{}
testUnderlyingCase := &testUnderlyingStruct{}
testCase.Data = testUnderlyingCase
err := Parse(testCase, nil)
require.Nil(t, err)
require.Equal(t, testCase.Int, 64)
require.Equal(t, testCase.Data.(*testUnderlyingStruct).Data, "Test data")
os.Unsetenv("INT")
os.Unsetenv("DATA_DATA")
os.Unsetenv(debugFlagEnvName)
}