diff --git a/fzf.go b/fzf.go index 0ace72f..8d1715f 100644 --- a/fzf.go +++ b/fzf.go @@ -1,6 +1,11 @@ package fzf -import tea "github.com/charmbracelet/bubbletea" +import ( + "fmt" + "reflect" + + tea "github.com/charmbracelet/bubbletea" +) var defaultFindOption = findOption{ itemPrefixFunc: nil, @@ -30,7 +35,15 @@ func (fzf *FZF) Find(items interface{}, itemFunc func(i int) string, opts ...Fin opt(&o) } - is, err := newItems(items, itemFunc, o.itemPrefixFunc) + rv := reflect.ValueOf(items) + switch { + case rv.Kind() == reflect.Slice: + case rv.Kind() == reflect.Ptr && reflect.Indirect(rv).Kind() == reflect.Slice: + default: + return nil, fmt.Errorf("items must be a slice, but got %T", items) + } + + is, err := newItems(rv, itemFunc, o.itemPrefixFunc) if err != nil { return nil, err } diff --git a/item.go b/item.go index 9b0b855..160ccc5 100644 --- a/item.go +++ b/item.go @@ -1,7 +1,6 @@ package fzf import ( - "fmt" "reflect" ) @@ -11,12 +10,7 @@ type items struct { itemPrefixFunc func(i int) string } -func newItems(is interface{}, itemFunc func(i int) string, itemPrefixFunc func(i int) string) (*items, error) { - rv := reflect.ValueOf(is) - if rv.Kind() != reflect.Slice { - return nil, fmt.Errorf("items must be a slice, but got %T", is) - } - +func newItems(rv reflect.Value, itemFunc func(i int) string, itemPrefixFunc func(i int) string) (*items, error) { return &items{ items: rv, itemFunc: itemFunc, @@ -29,7 +23,11 @@ func (is items) String(i int) string { } func (is items) Len() int { - return is.items.Len() + if is.items.Kind() == reflect.Ptr { + return reflect.Indirect(is.items).Len() + } else { + return is.items.Len() + } } func (is items) HasItemPrefixFunc() bool {