k9s/internal/model/history.go

132 lines
2.8 KiB
Go

// SPDX-License-Identifier: Apache-2.0
// Copyright Authors of K9s
package model
import (
"strings"
)
// MaxHistory tracks max command history.
const MaxHistory = 20
// History represents a command history.
type History struct {
commands []string
limit int
activeCommandIndex int
previousCommandIndex int
}
// NewHistory returns a new instance.
func NewHistory(limit int) *History {
return &History{
limit: limit,
}
}
// Last switches the current and previous history index positions so the
// new command referenced by the index is the previous command
func (h *History) Last() bool {
if h.Empty() {
return false
}
h.activeCommandIndex, h.previousCommandIndex = h.previousCommandIndex, h.activeCommandIndex
return true
}
// Back moves the history position index back by one
func (h *History) Back() bool {
if h.Empty() {
return false
}
// Return if there are no more commands left in the backward history
if h.activeCommandIndex == 0 {
return false
}
h.previousCommandIndex = h.activeCommandIndex
h.activeCommandIndex--
return true
}
// Forward moves the history position index forward by one
func (h *History) Forward() bool {
if h.Empty() {
return false
}
// Return if there are no more commands left in the forward history
if h.activeCommandIndex >= len(h.commands)-1 {
return false
}
h.previousCommandIndex = h.activeCommandIndex
h.activeCommandIndex++
return true
}
// CurrentIndex returns the current index of the active command in the history
func (h *History) CurrentIndex() int {
return h.activeCommandIndex
}
// PreviousIndex returns the index of the command that was the most recent
// active command in the history
func (h *History) PreviousIndex() int {
return h.previousCommandIndex
}
// Pop removes the single most recent history item
// and returns a bool if the list changed.
func (h *History) Pop() bool {
return h.PopN(1)
}
// PopN removes the N most recent history item
// and returns a bool if the list changed.
// Argument specifies how many to remove from the history
func (h *History) PopN(n int) bool {
cmdLength := len(h.commands)
if cmdLength == 0 {
return false
}
h.commands = h.commands[:cmdLength-n]
return true
}
// List returns the current command history.
func (h *History) List() []string {
return h.commands
}
// Push adds a new item.
func (h *History) Push(c string) {
if c == "" {
return
}
c = strings.ToLower(c)
if len(h.commands) < h.limit {
h.commands = append(h.commands, c)
h.previousCommandIndex = h.activeCommandIndex
h.activeCommandIndex = len(h.commands) - 1
return
}
}
// Clear clears out the stack.
func (h *History) Clear() {
h.commands = nil
h.activeCommandIndex = 0
h.previousCommandIndex = 0
}
// Empty returns true if no history.
func (h *History) Empty() bool {
return len(h.commands) == 0
}