omniputation/queue-golang/main.go

147 lines
3 KiB
Go
Raw Permalink Normal View History

2024-12-13 10:56:25 +00:00
package main
import (
"fmt"
"log"
"strconv"
"strings"
"github.com/charmbracelet/bubbles/textinput"
"github.com/charmbracelet/lipgloss"
tea "github.com/charmbracelet/bubbletea"
)
var (
command = lipgloss.NewStyle().Foreground(lipgloss.Color("12")).Background(lipgloss.Color("235"))
list = lipgloss.NewStyle().Bold(true)
padding = lipgloss.NewStyle().PaddingTop(1).PaddingLeft(2)
red = lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("9"))
green = lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("10"))
)
func enqueue(queue []int64, number string) []int64 {
integer, err := strconv.ParseInt(number, 10, 64)
if err != nil {
fmt.Println("Error:", err)
}
if len(queue) < 5 {
queue = append([]int64{integer}, queue...)
}
return queue
}
func dequeue(queue []int64) []int64 {
if len(queue) > 0 {
queue = queue[:len(queue)-1]
}
return queue
}
func check(queue []int64) string {
if len(queue) == 0 {
return fmt.Sprintf("The queue is currently %v", green.Render("empty"))
} else if len(queue) == 5 {
return fmt.Sprintf("The queue is currently %v", red.Render("full"))
} else {
return fmt.Sprintf("The queue is currently neither %v nor %v", green.Render("empty"), red.Render("full"))
}
}
type (
errMsg error
)
type model struct {
textInput textinput.Model
queue []int64
status string
show bool
err error
}
func initialModel() model {
ti := textinput.New()
ti.Placeholder = "enqueue 9"
ti.Focus()
ti.CharLimit = 156
ti.Width = 20
return model{
textInput: ti,
err: nil,
}
}
func (m model) Init() tea.Cmd {
return textinput.Blink
}
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
var cmd tea.Cmd
switch msg := msg.(type) {
case tea.KeyMsg:
switch msg.Type {
case tea.KeyCtrlC:
return m, tea.Quit
case tea.KeyEnter:
arguments := strings.Split(m.textInput.Value(), " ")
switch arguments[0] {
case "enqueue":
m.show = false
m.queue = enqueue(m.queue, arguments[1])
case "dequeue":
m.show = false
m.queue = dequeue(m.queue)
case "check":
m.show = true
m.status = check(m.queue)
default:
m.show = true
m.status = red.Render("This action is unsupported")
}
}
case errMsg:
m.err = msg
return m, nil
}
m.textInput, cmd = m.textInput.Update(msg)
return m, cmd
}
func (m model) View() string {
command_list := fmt.Sprintf(
"Valid commands: %s, %s, %s",
command.Render(" enqueue "),
command.Render(" dequeue "),
command.Render(" check "),
)
if m.show {
return padding.Render(fmt.Sprintf(
"%v\n\n%v\n\n%s",
command_list,
m.status,
m.textInput.View(),
)) + "\n"
} else {
return padding.Render(fmt.Sprintf(
"%v\n\n%v\n\n%s",
command_list,
list.Render(fmt.Sprintf("%v", m.queue)),
m.textInput.View(),
)) + "\n"
}
}
func main() {
p := tea.NewProgram(initialModel())
if _, err := p.Run(); err != nil {
log.Fatal(err)
}
}