pelican/internal/ui/ui.go

137 lines
2.7 KiB
Go
Raw Normal View History

2021-09-16 06:51:21 +01:00
// Right now this will be a very simple, scuffed interface.
package ui
2021-09-16 06:51:21 +01:00
import (
"fmt"
"forge.dananglin.me.uk/code/dananglin/pelican/internal/board"
2021-09-16 06:51:21 +01:00
"github.com/eiannone/keyboard"
bolt "go.etcd.io/bbolt"
2021-09-16 06:51:21 +01:00
)
func App() error {
var db *bolt.DB
var err error
2021-09-16 06:51:21 +01:00
keysEvents, err := keyboard.GetKeys(10)
if err != nil {
return fmt.Errorf("unable to create the keysEvent channel, %w", err)
}
defer func() {
_ = keyboard.Close()
}()
fmt.Println(usage())
2021-09-16 06:51:21 +01:00
app:
2021-09-16 06:51:21 +01:00
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 = refresh(db); err != nil {
2021-09-16 06:51:21 +01:00
fmt.Printf("Error: Unable to refresh board, %s\n", err)
}
case 'a':
if err = newCard(db); err != nil {
2021-09-16 06:51:21 +01:00
fmt.Printf("Error: Unable to add a card, %s\n", err)
}
case 'v':
if err = viewCard(db, 1); err != nil {
2021-09-16 06:51:21 +01:00
fmt.Printf("Error: Unable to view card, %s\n", err)
}
case 'o':
// TODO: How do we close the db?
db, err = openProject("")
if err != nil {
fmt.Printf("Error: Unable to open the project, %s\n", err)
}
2021-09-16 06:51:21 +01:00
default:
fmt.Println("Error: Unknown key event.")
}
}
db.Close()
2021-09-16 06:51:21 +01:00
return nil
}
func refresh(db *bolt.DB) error {
statusList, err := board.ReadStatusList(db)
2021-09-16 06:51:21 +01:00
if err != nil {
return fmt.Errorf("unable to get the status list, %w", err)
2021-09-16 06:51:21 +01:00
}
fmt.Printf("--------------------\n")
for _, s := range statusList {
2021-09-16 06:51:21 +01:00
fmt.Printf("Status ID: %d\nStatus Name: \"%s\"\nCard IDs: %v\n\n", s.ID, s.Name, s.CardIds)
}
2021-09-16 06:51:21 +01:00
fmt.Printf("--------------------\n\n\n")
return nil
}
func newCard(db *bolt.DB) error {
2021-09-16 06:51:21 +01:00
title := "A card title"
content := "As a user, this is a ticket for me.\nAs a user, I want to close it."
if err := board.CreateCard(db, title, content); err != nil {
return fmt.Errorf("unable to create card, %w", err)
2021-09-16 06:51:21 +01:00
}
fmt.Println("Sample card created successfully.")
return nil
}
func viewCard(db *bolt.DB, id int) error {
card, err := board.ReadCard(db, id)
2021-09-16 06:51:21 +01:00
if err != nil {
return fmt.Errorf("unable to read card, %w", err)
2021-09-16 06:51:21 +01:00
}
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 openProject(path string) (*bolt.DB, error) {
db, err := board.LoadBoard(path)
if err != nil {
return nil, fmt.Errorf("unable to load board, %w", err)
}
if err = refresh(db); err != nil {
return nil, err
}
return db, nil
}
func usage() string {
2021-09-16 06:51:21 +01:00
usage := `
Press 'o' to open the project
2021-09-16 06:51:21 +01:00
Press 'r' to refresh the board
Press 'a' to add a sample card
Press 'v' to view the first sample card
Press 'q' to quit
2021-09-16 06:51:21 +01:00
`
return usage
2021-09-16 06:51:21 +01:00
}