commit 7f1b6e273f18bfc795a50d0f5324e68034990ef2
parent 9e9ee5bdfa7af9d79694d9cc3f12af9574167f81
Author: lash <dev@holbrook.no>
Date: Thu, 28 Nov 2024 12:32:40 +0000
Add customizable menu separator
Diffstat:
2 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/render/menu.go b/render/menu.go
@@ -61,6 +61,7 @@ type Menu struct {
//outputSize uint16 // maximum size constraint for the menu.
sink bool
keep bool
+ sep string
}
// String implements the String interface.
@@ -74,10 +75,17 @@ func(m Menu) String() string {
func NewMenu() *Menu {
return &Menu{
keep: true,
+ sep: ":",
}
}
// WithPageCount is a chainable function that defines the number of allowed pages for browsing.
+func(m *Menu) WithSeparator(sep string) *Menu {
+ m.sep = sep
+ return m
+}
+
+// WithPageCount is a chainable function that defines the number of allowed pages for browsing.
func(m *Menu) WithPageCount(pageCount uint16) *Menu {
m.pageCount = pageCount
return m
@@ -222,7 +230,7 @@ func(m *Menu) Render(ctx context.Context, idx uint16) (string, error) {
if err != nil {
return "", err
}
- r += fmt.Sprintf("%s:%s", choice, title)
+ r += fmt.Sprintf("%s%s%s", choice, m.sep, title)
}
if m.keep {
m.menu = menuCopy
diff --git a/render/menu_test.go b/render/menu_test.go
@@ -86,3 +86,26 @@ func TestMenuBrowse(t *testing.T) {
t.Fatalf("expected render fail")
}
}
+
+func TestMenuSep(t *testing.T) {
+ m := NewMenu().WithSeparator("//")
+ err := m.Put("1", "foo")
+ if err != nil {
+ t.Fatal(err)
+ }
+ err = m.Put("2", "bar")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ ctx := context.TODO()
+ r, err := m.Render(ctx, 0)
+ if err != nil {
+ t.Fatal(err)
+ }
+ expect := `1//foo
+2//bar`
+ if r != expect {
+ t.Fatalf("expected:\n\t%s\ngot:\n\t%s\n", expect, r)
+ }
+}