diff --git a/README.rst b/README.rst index 83c4b52..2c3dfb7 100644 --- a/README.rst +++ b/README.rst @@ -372,6 +372,20 @@ Retrieves the value at path of struct(s). funk.Get([]*Foo{foo1, foo2}, "Bar.Name") // []string{"Test"} funk.Get(foo2, "Bar.Name") // nil + + +funk.GetOrElse +......... + +Retrieves the value of the pointer or default. + +.. code-block:: go + str := "hello world" + GetOrElse(&str, "foobar") // string{"hello world"} + GetOrElse(str, "foobar") // string{"hello world"} + GetOrElse(nil, "foobar") // string{"foobar"} + + funk.Keys ......... diff --git a/retrieve.go b/retrieve.go index e2fe751..ea49c82 100644 --- a/retrieve.go +++ b/retrieve.go @@ -21,11 +21,11 @@ func get(value reflect.Value, path string) reflect.Value { var resultSlice reflect.Value length := value.Len() - + if length == 0 { return resultSlice } - + for i := 0; i < length; i++ { item := value.Index(i) @@ -77,3 +77,14 @@ func get(value reflect.Value, path string) reflect.Value { return value } + +// Get retrieves the value of the pointer or default. +func GetOrElse(v interface{}, def interface{}) interface{} { + val := reflect.ValueOf(v) + if v == nil { + return def + } else if val.Kind() != reflect.Ptr { + return v + } + return val.Elem().Interface() +} diff --git a/retrieve_test.go b/retrieve_test.go index 3654665..71d248d 100644 --- a/retrieve_test.go +++ b/retrieve_test.go @@ -46,3 +46,12 @@ func TestGetSimple(t *testing.T) { is.Equal(result, []string{"Level1-1", "Level1-2"}) } + +func TestGetOrElse(t *testing.T) { + is := assert.New(t) + + str := "hello world" + is.Equal("hello world", GetOrElse(&str, "foobar")) + is.Equal("hello world", GetOrElse(str, "foobar")) + is.Equal("foobar", GetOrElse(nil, "foobar")) +}