Skip to content

Commit

Permalink
Unstructed helpers: document lack of slice syntax
Browse files Browse the repository at this point in the history
  • Loading branch information
pmorie committed May 30, 2019
1 parent b8eecd6 commit 82880b8
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 2 deletions.
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
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

0 comments on commit 82880b8

Please sign in to comment.