Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions spinner.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,15 @@ type Spinner interface {
SetTitle(title string) error
}

// SpinnerBuilder follows the builder pattern for creating a Spinner.
type SpinnerBuilder interface {
WithWriter(writer io.Writer) SpinnerBuilder
WithTitle(title string) SpinnerBuilder
WithInterval(interval time.Duration) SpinnerBuilder
WithFormatter(formatter SpinnerFormatter) SpinnerBuilder
Build() Spinner
}

type spinner struct {
writer io.Writer
interval time.Duration
Expand Down Expand Up @@ -90,6 +99,46 @@ func NewDefaultSpinner() Spinner {
return NewSpinner(StdoutWriter, "", time.Millisecond*100, DefaultSpinnerFormatter())
}

type spinnerBuilder struct {
writer io.Writer
title string
interval time.Duration
formatter SpinnerFormatter
}

// NewSpinnerBuilder creates a new SpinnerBuilder with default values.
func NewSpinnerBuilder() SpinnerBuilder {
return &spinnerBuilder{
writer: StdoutWriter,
interval: time.Millisecond * 100,
formatter: DefaultSpinnerFormatter(),
}
}

func (b *spinnerBuilder) WithWriter(writer io.Writer) SpinnerBuilder {
b.writer = writer
return b
}

func (b *spinnerBuilder) WithTitle(title string) SpinnerBuilder {
b.title = title
return b
}

func (b *spinnerBuilder) WithInterval(interval time.Duration) SpinnerBuilder {
b.interval = interval
return b
}

func (b *spinnerBuilder) WithFormatter(formatter SpinnerFormatter) SpinnerBuilder {
b.formatter = formatter
return b
}

func (b *spinnerBuilder) Build() Spinner {
return NewSpinner(b.writer, b.title, b.interval, b.formatter)
}

func (s *spinner) writeString(str string) (n int, err error) {
return io.WriteString(s.writer, str)
}
Expand Down
Loading