Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unstructed helpers: document lack of slice syntax #78539

Merged
merged 1 commit into from
Aug 21, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ import (
// NestedFieldCopy returns a deep copy of the value of a nested field.
// Returns false if the value is missing.
// No error is returned for a nil field.
//
// Note: fields passed to this function are treated as keys within the passed
// object; no array/slice syntax is supported.
func NestedFieldCopy(obj map[string]interface{}, fields ...string) (interface{}, bool, error) {
val, found, err := NestedFieldNoCopy(obj, fields...)
if !found || err != nil {
Expand All @@ -43,6 +46,9 @@ func NestedFieldCopy(obj map[string]interface{}, fields ...string) (interface{},
// NestedFieldNoCopy returns a reference to a nested field.
// Returns false if value is not found and an error if unable
// to traverse obj.
//
// Note: fields passed to this function are treated as keys within the passed
// object; no array/slice syntax is supported.
func NestedFieldNoCopy(obj map[string]interface{}, fields ...string) (interface{}, bool, error) {
var val interface{} = obj

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,11 @@ func TestNestedFieldNoCopy(t *testing.T) {
"b": target,
"c": nil,
"d": []interface{}{"foo"},
"e": []interface{}{
map[string]interface{}{
"f": "bar",
},
},
},
}

Expand All @@ -91,13 +96,13 @@ func TestNestedFieldNoCopy(t *testing.T) {
assert.Nil(t, res)

// case 4: field does not exist
res, exists, err = NestedFieldNoCopy(obj, "a", "e")
res, exists, err = NestedFieldNoCopy(obj, "a", "g")
assert.False(t, exists)
assert.Nil(t, err)
assert.Nil(t, res)

// case 5: intermediate field does not exist
res, exists, err = NestedFieldNoCopy(obj, "a", "e", "f")
res, exists, err = NestedFieldNoCopy(obj, "a", "g", "f")
assert.False(t, exists)
assert.Nil(t, err)
assert.Nil(t, res)
Expand All @@ -108,6 +113,13 @@ func TestNestedFieldNoCopy(t *testing.T) {
assert.False(t, exists)
assert.Nil(t, err)
assert.Nil(t, res)

// case 7: array/slice syntax is not supported
// (background: users may expect this to be supported)
res, exists, err = NestedFieldNoCopy(obj, "a", "e[0]")
assert.False(t, exists)
assert.Nil(t, err)
assert.Nil(t, res)
}

func TestNestedFieldCopy(t *testing.T) {
Expand Down