From 5110925e8788a8ecfd206df0da8dbeed36cde0f0 Mon Sep 17 00:00:00 2001 From: Florian Rey Date: Fri, 7 Jun 2024 18:24:16 +0200 Subject: [PATCH] feat: Introduce paginator options --- paginator/paginator.go | 27 +++++++++++++++++++++++++-- paginator/paginator_test.go | 26 ++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/paginator/paginator.go b/paginator/paginator.go index 82dc3ed3..de05a85b 100644 --- a/paginator/paginator.go +++ b/paginator/paginator.go @@ -130,9 +130,12 @@ func (m Model) OnFirstPage() bool { return m.Page == 0 } +// Option is used to set options in New. +type Option func(*Model) + // New creates a new model with defaults. -func New() Model { - return Model{ +func New(opts ...Option) Model { + m := Model{ Type: Arabic, Page: 0, PerPage: 1, @@ -142,6 +145,12 @@ func New() Model { InactiveDot: "○", ArabicFormat: "%d/%d", } + + for _, opt := range opts { + opt(&m) + } + + return m } // NewModel creates a new model with defaults. @@ -149,6 +158,20 @@ func New() Model { // Deprecated: use [New] instead. var NewModel = New +// WithTotalPages sets the total pages. +func WithTotalPages(totalPages int) Option { + return func(m *Model) { + m.TotalPages = totalPages + } +} + +// WithPerPage sets the total pages. +func WithPerPage(perPage int) Option { + return func(m *Model) { + m.PerPage = perPage + } +} + // Update is the Tea update function which binds keystrokes to pagination. func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { switch msg := msg.(type) { diff --git a/paginator/paginator_test.go b/paginator/paginator_test.go index 57f326c6..679e6824 100644 --- a/paginator/paginator_test.go +++ b/paginator/paginator_test.go @@ -6,6 +6,32 @@ import ( tea "github.com/charmbracelet/bubbletea" ) +func TestNew(t *testing.T) { + model := New() + + if model.PerPage != 1 { + t.Errorf("PerPage = %d, expected %d", model.PerPage, 1) + } + if model.TotalPages != 1 { + t.Errorf("TotalPages = %d, expected %d", model.TotalPages, 1) + } + + perPage := 42 + totalPages := 42 + + model = New( + WithPerPage(perPage), + WithTotalPages(totalPages), + ) + + if model.PerPage != perPage { + t.Errorf("PerPage = %d, expected %d", model.PerPage, perPage) + } + if model.TotalPages != totalPages { + t.Errorf("TotalPages = %d, expected %d", model.TotalPages, totalPages) + } +} + func TestSetTotalPages(t *testing.T) { tests := []struct { name string