go-prompt/option.go
2018-10-21 19:53:03 +09:00

292 lines
8.0 KiB
Go

package prompt
import "fmt"
// Option is the type to replace default parameters.
// prompt.New accepts any number of options (this is functional option pattern).
type Option func(prompt *Prompt) error
// OptionParser to set a custom ConsoleParser object. An argument should implement ConsoleParser interface.
func OptionParser(x ConsoleParser) Option {
return func(p *Prompt) error {
p.in = x
return nil
}
}
// OptionWriter to set a custom ConsoleWriter object. An argument should implement ConsoleWriter interface.
func OptionWriter(x ConsoleWriter) Option {
return func(p *Prompt) error {
registerConsoleWriter(x)
p.rendererOptions = append(p.rendererOptions, func(r *Renderer) {
r.out = x
})
return nil
}
}
// OptionTitle to set title displayed at the header bar of terminal.
func OptionTitle(x string) Option {
return func(p *Prompt) error {
p.rendererOptions = append(p.rendererOptions, func(r *Renderer) {
r.title = x
})
return nil
}
}
// OptionPrefix to set prefix string.
func OptionPrefix(x string) Option {
return func(p *Prompt) error {
p.rendererOptions = append(p.rendererOptions, func(r *Renderer) {
r.prefix = x
})
return nil
}
}
// OptionCompletionWordSeparator to set word separators. Enable only ' ' if empty.
func OptionCompletionWordSeparator(x string) Option {
return func(p *Prompt) error {
p.completion.wordSeparator = x
return nil
}
}
// OptionLivePrefix to change the prefix dynamically by callback function
func OptionLivePrefix(f func() (prefix string, useLivePrefix bool)) Option {
return func(p *Prompt) error {
p.rendererOptions = append(p.rendererOptions, func(r *Renderer) {
r.livePrefixCallback = f
})
return nil
}
}
// OptionPrefixTextColor change a text color of prefix string
func OptionPrefixTextColor(x Color) Option {
return func(p *Prompt) error {
p.rendererOptions = append(p.rendererOptions, func(r *Renderer) {
r.prefixTextColor = x
})
return nil
}
}
// OptionPrefixBackgroundColor to change a background color of prefix string
func OptionPrefixBackgroundColor(x Color) Option {
return func(p *Prompt) error {
p.rendererOptions = append(p.rendererOptions, func(r *Renderer) {
r.prefixBGColor = x
})
return nil
}
}
// OptionInputTextColor to change a color of text which is input by user
func OptionInputTextColor(x Color) Option {
return func(p *Prompt) error {
p.rendererOptions = append(p.rendererOptions, func(r *Renderer) {
r.inputTextColor = x
})
return nil
}
}
// OptionInputBGColor to change a color of background which is input by user
func OptionInputBGColor(x Color) Option {
return func(p *Prompt) error {
p.rendererOptions = append(p.rendererOptions, func(r *Renderer) {
r.inputBGColor = x
})
return nil
}
}
// OptionPreviewSuggestionTextColor to change a text color which is completed
func OptionPreviewSuggestionTextColor(x Color) Option {
return func(p *Prompt) error {
p.rendererOptions = append(p.rendererOptions, func(r *Renderer) {
r.previewSuggestionTextColor = x
})
return nil
}
}
// OptionPreviewSuggestionBGColor to change a background color which is completed
func OptionPreviewSuggestionBGColor(x Color) Option {
return func(p *Prompt) error {
p.rendererOptions = append(p.rendererOptions, func(r *Renderer) {
r.previewSuggestionBGColor = x
})
return nil
}
}
// OptionSuggestionTextColor to change a text color in drop down suggestions.
func OptionSuggestionTextColor(x Color) Option {
return func(p *Prompt) error {
p.rendererOptions = append(p.rendererOptions, func(r *Renderer) {
r.suggestionTextColor = x
})
return nil
}
}
// OptionSuggestionBGColor change a background color in drop down suggestions.
func OptionSuggestionBGColor(x Color) Option {
return func(p *Prompt) error {
p.rendererOptions = append(p.rendererOptions, func(r *Renderer) {
r.suggestionBGColor = x
})
return nil
}
}
// OptionSelectedSuggestionTextColor to change a text color for completed text which is selected inside suggestions drop down box.
func OptionSelectedSuggestionTextColor(x Color) Option {
return func(p *Prompt) error {
p.rendererOptions = append(p.rendererOptions, func(r *Renderer) {
r.selectedSuggestionTextColor = x
})
return nil
}
}
// OptionSelectedSuggestionBGColor to change a background color for completed text which is selected inside suggestions drop down box.
func OptionSelectedSuggestionBGColor(x Color) Option {
return func(p *Prompt) error {
p.rendererOptions = append(p.rendererOptions, func(r *Renderer) {
r.selectedSuggestionBGColor = x
})
return nil
}
}
// OptionDescriptionTextColor to change a background color of description text in drop down suggestions.
func OptionDescriptionTextColor(x Color) Option {
return func(p *Prompt) error {
p.rendererOptions = append(p.rendererOptions, func(r *Renderer) {
r.selectedDescriptionTextColor = x
})
return nil
}
}
// OptionDescriptionBGColor to change a background color of description text in drop down suggestions.
func OptionDescriptionBGColor(x Color) Option {
return func(p *Prompt) error {
p.rendererOptions = append(p.rendererOptions, func(r *Renderer) {
r.selectedDescriptionBGColor = x
})
return nil
}
}
// OptionSelectedDescriptionTextColor to change a text color of description which is selected inside suggestions drop down box.
func OptionSelectedDescriptionTextColor(x Color) Option {
return func(p *Prompt) error {
p.rendererOptions = append(p.rendererOptions, func(r *Renderer) {
r.selectedDescriptionTextColor = x
})
return nil
}
}
// OptionSelectedDescriptionBGColor to change a background color of description which is selected inside suggestions drop down box.
func OptionSelectedDescriptionBGColor(x Color) Option {
return func(p *Prompt) error {
p.rendererOptions = append(p.rendererOptions, func(r *Renderer) {
r.selectedDescriptionBGColor = x
})
return nil
}
}
// OptionScrollbarThumbColor to change a thumb color on scrollbar.
func OptionScrollbarThumbColor(x Color) Option {
return func(p *Prompt) error {
p.rendererOptions = append(p.rendererOptions, func(r *Renderer) {
r.scrollbarThumbColor = x
})
return nil
}
}
// OptionScrollbarBGColor to change a background color of scrollbar.
func OptionScrollbarBGColor(x Color) Option {
return func(p *Prompt) error {
p.rendererOptions = append(p.rendererOptions, func(r *Renderer) {
r.scrollbarBGColor = x
})
return nil
}
}
// OptionMaxSuggestion specify the max number of displayed suggestions.
func OptionMaxSuggestion(x uint16) Option {
return func(p *Prompt) error {
p.completion.max = x
return nil
}
}
// OptionHistory to set history expressed by string array.
func OptionHistory(x []string) Option {
return func(p *Prompt) error {
p.history.histories = x
p.history.Clear()
return nil
}
}
// OptionSwitchKeyBindMode set a key bind mode.
func OptionSwitchKeyBindMode(m KeyBindMode) Option {
return func(p *Prompt) error {
p.keyBindMode = m
return nil
}
}
// OptionAddKeyBind to set a custom key bind.
func OptionAddKeyBind(b ...KeyBind) Option {
return func(p *Prompt) error {
p.keyBindings = append(p.keyBindings, b...)
return nil
}
}
// OptionAddASCIICodeBind to set a custom key bind.
func OptionAddASCIICodeBind(b ...ASCIICodeBind) Option {
return func(p *Prompt) error {
p.ASCIICodeBindings = append(p.ASCIICodeBindings, b...)
return nil
}
}
// New returns a Prompt with powerful auto-completion.
func New(executor Executor, completer Completer, opts ...Option) *Prompt {
defaultWriter, err := NewStandardOutputWriter()
if err != nil {
panic(fmt.Sprintf("new stdout writer: %s", err))
}
registerConsoleWriter(defaultWriter)
pt := &Prompt{
in: NewStandardInputParser(),
rendererOptions: make([]RendererOption, 0, 12),
buf: NewBuffer(),
executor: executor,
history: NewHistory(),
completion: NewCompletionManager(completer, 6),
keyBindMode: EmacsKeyBind, // All the above assume that bash is running in the default Emacs setting
}
for _, opt := range opts {
if err := opt(pt); err != nil {
panic(err)
}
}
return pt
}