initial CLI exploration
This commit is contained in:
@@ -1,4 +1,106 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"git.yetaga.in/alazyreader/library/config"
|
||||
"github.com/gdamore/tcell"
|
||||
"github.com/kelseyhightower/envconfig"
|
||||
)
|
||||
|
||||
func main() {
|
||||
var c config.Config
|
||||
err := envconfig.Process("library", &c)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
|
||||
screen, err := tcell.NewScreen()
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
err = screen.Init()
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
screen.Clear()
|
||||
inc := 0
|
||||
for {
|
||||
e := screen.PollEvent()
|
||||
screen.Clear()
|
||||
w, h := screen.Size()
|
||||
b := &box{h: h, w: w, x: 0, y: 0, title: "library", menuItems: []string{"(e)dit", "(q)uit"}}
|
||||
switch v := e.(type) {
|
||||
case *tcell.EventError:
|
||||
screen.Beep()
|
||||
b.draw(screen)
|
||||
screen.SetContent(1, 1, 'E', nil, tcell.StyleDefault)
|
||||
case *tcell.EventInterrupt:
|
||||
b.draw(screen)
|
||||
screen.Sync()
|
||||
case *tcell.EventKey:
|
||||
inc += 1
|
||||
b.draw(screen)
|
||||
screen.SetContent(1, 1, v.Rune(), nil, tcell.StyleDefault)
|
||||
screen.SetContent(2, 2, rune(inc+48), nil, tcell.StyleDefault)
|
||||
if v.Rune() == 'q' {
|
||||
screen.Fini()
|
||||
return
|
||||
}
|
||||
screen.Sync()
|
||||
case *tcell.EventMouse:
|
||||
continue
|
||||
case *tcell.EventResize:
|
||||
b.draw(screen)
|
||||
screen.Sync()
|
||||
case *tcell.EventTime:
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type box struct {
|
||||
x, y int
|
||||
h, w int
|
||||
title string
|
||||
menuItems []string
|
||||
}
|
||||
|
||||
func (b *box) draw(s tcell.Screen) {
|
||||
for m := 1; m < b.w-1; m++ {
|
||||
s.SetContent(m, b.y, tcell.RuneHLine, nil, tcell.StyleDefault)
|
||||
s.SetContent(m, b.h-1, tcell.RuneHLine, nil, tcell.StyleDefault)
|
||||
}
|
||||
for m := 1; m < b.h-1; m++ {
|
||||
s.SetContent(b.x, m, tcell.RuneVLine, nil, tcell.StyleDefault)
|
||||
s.SetContent(b.w-1, m, tcell.RuneVLine, nil, tcell.StyleDefault)
|
||||
}
|
||||
s.SetContent(b.x, b.y, tcell.RuneULCorner, nil, tcell.StyleDefault)
|
||||
s.SetContent(b.w-1, b.y, tcell.RuneURCorner, nil, tcell.StyleDefault)
|
||||
s.SetContent(b.x, b.h-1, tcell.RuneLLCorner, nil, tcell.StyleDefault)
|
||||
s.SetContent(b.w-1, b.h-1, tcell.RuneLRCorner, nil, tcell.StyleDefault)
|
||||
|
||||
if b.title != "" {
|
||||
t := b.x + 2
|
||||
s.SetContent(t, b.y, ' ', nil, tcell.StyleDefault)
|
||||
t++
|
||||
for _, r := range b.title {
|
||||
s.SetContent(t, b.y, r, nil, tcell.StyleDefault)
|
||||
t++
|
||||
}
|
||||
s.SetContent(t, b.y, ' ', nil, tcell.StyleDefault)
|
||||
}
|
||||
if len(b.menuItems) != 0 {
|
||||
t := b.x + 2
|
||||
s.SetContent(t, b.h-1, ' ', nil, tcell.StyleDefault)
|
||||
t++
|
||||
for i := range b.menuItems {
|
||||
for _, r := range b.menuItems[i] {
|
||||
s.SetContent(t, b.h-1, r, nil, tcell.StyleDefault)
|
||||
t++
|
||||
}
|
||||
s.SetContent(t, b.h-1, ' ', nil, tcell.StyleDefault)
|
||||
t++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -8,19 +8,12 @@ import (
|
||||
"net/http"
|
||||
|
||||
"git.yetaga.in/alazyreader/library/book"
|
||||
"git.yetaga.in/alazyreader/library/config"
|
||||
"git.yetaga.in/alazyreader/library/database"
|
||||
"git.yetaga.in/alazyreader/library/frontend"
|
||||
"github.com/kelseyhightower/envconfig"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
DBUser string
|
||||
DBPass string
|
||||
DBHost string
|
||||
DBPort string
|
||||
DBName string
|
||||
}
|
||||
|
||||
type Library interface {
|
||||
GetAllBooks(context.Context) ([]book.Book, error)
|
||||
}
|
||||
@@ -63,7 +56,7 @@ func StaticHandler(f fs.FS) http.Handler {
|
||||
}
|
||||
|
||||
func main() {
|
||||
var c Config
|
||||
var c config.Config
|
||||
err := envconfig.Process("library", &c)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
|
Reference in New Issue
Block a user