pelican/ui.go

113 lines
2.2 KiB
Go

// Right now this will be a very simple, scuffed interface.
package main
import (
"fmt"
bolt "go.etcd.io/bbolt"
"github.com/eiannone/keyboard"
)
func badUI(db *bolt.DB) error {
keysEvents, err := keyboard.GetKeys(10)
if err != nil {
return fmt.Errorf("unable to create the keysEvent channel, %w", err)
}
defer func() {
_ = keyboard.Close()
}()
// infinite loop
fmt.Println(uiUsage())
app:
for {
event := <-keysEvents
if event.Err != nil {
return fmt.Errorf("keys event error: %w", event.Err)
}
switch event.Rune {
case 'q':
break app
case 'r':
if err := uiRefreshScuffedBoard(db); err != nil {
fmt.Printf("Error: Unable to refresh board, %s\n", err)
}
case 'a':
if err := uiCreateCard(db); err != nil {
fmt.Printf("Error: Unable to add a card, %s\n", err)
}
case 'v':
if err := uiViewCard(db, 1); err != nil {
fmt.Printf("Error: Unable to view card, %s\n", err)
}
default:
fmt.Println("Error: Unknown key event.")
}
}
// wait for a keyboard press
// take action
// a to add a card
// u to update a card
return nil
}
func uiRefreshScuffedBoard(db *bolt.DB) error {
statusList, err := readStatuses(db)
if err != nil {
return err
}
fmt.Printf("--------------------\n")
for _, s := range statusList{
fmt.Printf("Status ID: %d\nStatus Name: \"%s\"\nCard IDs: %v\n\n", s.ID, s.Name, s.CardIds)
}
fmt.Printf("--------------------\n\n\n")
return nil
}
func uiCreateCard(db *bolt.DB) error {
title := "A card title"
content := "As a user, this is a ticket for me.\nAs a user, I want to close it."
if err := createCard(db, title, content); err != nil {
return err
}
fmt.Println("Sample card created successfully.")
return nil
}
func uiViewCard(db *bolt.DB, id int) error {
card, err := readCard(db, id)
if err != nil {
return err
}
fmt.Printf("====================\n")
fmt.Printf("[%d] %s\n", card.ID, card.Title)
fmt.Printf("--------------------\n")
fmt.Println(card.Content)
fmt.Printf("====================\n")
return nil
}
func uiUsage() string {
usage := `
Press 'q' to quit
Press 'r' to refresh the board
Press 'a' to add a sample card
Press 'v' to view the first sample card
`
return usage
}