From 4018f26998c8ca9b4217ac9201af5012a722318f Mon Sep 17 00:00:00 2001 From: The Magician Date: Fri, 31 May 2024 20:32:44 +0100 Subject: [PATCH] Implement basic search-and-store functionality --- sevenkeys/database/cardstoragelocation.go | 4 +-- sevenkeys/logic/search.go | 30 +++++++++++++++++++++ sevenkeys/logic/storage.go | 22 +++++++++++----- sevenkeys/logic/ui.go | 19 ++++++++++++++ sevenkeys/main.go | 32 ++++++++++++++++++++--- sevenkeys/printinglist.go | 27 ------------------- 6 files changed, 95 insertions(+), 39 deletions(-) create mode 100644 sevenkeys/logic/ui.go delete mode 100644 sevenkeys/printinglist.go diff --git a/sevenkeys/database/cardstoragelocation.go b/sevenkeys/database/cardstoragelocation.go index acaf148..59d3905 100644 --- a/sevenkeys/database/cardstoragelocation.go +++ b/sevenkeys/database/cardstoragelocation.go @@ -25,7 +25,7 @@ func GetLastPositionInBox(db *sql.DB, storageBox string) (int, error) { return lastPosition, nil } -func InsertCardStorageLocation(db *sql.DB, location CardStorageLocation) error { +func InsertCardStorageLocation(db *sql.DB, storageLocation CardStorageLocation) error { query := `INSERT INTO CardStorageLocation (CardPrintingId, StorageBox, Position, Source) VALUES (?, ?, ?, ?);` @@ -35,7 +35,7 @@ func InsertCardStorageLocation(db *sql.DB, location CardStorageLocation) error { return err } - _, err = insert.Exec(location.CardPrintingId, location.StorageBox, location.Position, location.Source) + _, err = insert.Exec(storageLocation.CardPrintingId, storageLocation.StorageBox, storageLocation.Position, storageLocation.Source) if err != nil { return err } diff --git a/sevenkeys/logic/search.go b/sevenkeys/logic/search.go index 12010e3..5ab286a 100644 --- a/sevenkeys/logic/search.go +++ b/sevenkeys/logic/search.go @@ -3,7 +3,11 @@ package logic import ( "database/sql" "fmt" + "io" + "os" + "os/exec" "sevenkeys/database" + "strings" ) // The SearchOptions type is a map of `string`s (which can be searched using fzf) @@ -34,3 +38,29 @@ func GetAllSearchOptions(db *sql.DB) (SearchOptions, error) { return searchOptions, err } + +func Search(searchOptions SearchOptions) (int, string, error) { + cmd := exec.Command("fzf") + cmd.Stderr = os.Stderr + + fzfStdin, err := cmd.StdinPipe() + if err != nil { + return -1, "", err + } + + go func() { + defer fzfStdin.Close() + for searchString, _ := range searchOptions { + io.WriteString(fzfStdin, searchString+"\n") + } + }() + + fzfOutput, err := cmd.Output() + if err != nil { + return -1, "", err + } + + key := strings.TrimSuffix(string(fzfOutput), "\n") + + return searchOptions[key], key, nil +} diff --git a/sevenkeys/logic/storage.go b/sevenkeys/logic/storage.go index dd91a9e..532d227 100644 --- a/sevenkeys/logic/storage.go +++ b/sevenkeys/logic/storage.go @@ -1,12 +1,22 @@ package logic -import "fmt" +import ( + "database/sql" + "sevenkeys/database" +) -func GetStorageLocation() string { - fmt.Print("Enter storage location: ") +func StoreCard(db *sql.DB, storageLocation database.CardStorageLocation) error { + lastPosition, err := database.GetLastPositionInBox(db, storageLocation.StorageBox) + if err != nil { + return err + } - var response string - fmt.Scan(&response) + storageLocation.Position = lastPosition + 1 - return response + err = database.InsertCardStorageLocation(db, storageLocation) + if err != nil { + return err + } + + return nil } diff --git a/sevenkeys/logic/ui.go b/sevenkeys/logic/ui.go new file mode 100644 index 0000000..627430d --- /dev/null +++ b/sevenkeys/logic/ui.go @@ -0,0 +1,19 @@ +package logic + +import ( + "bufio" + "fmt" + "os" +) + +func GetResponse(prompt string) string { + fmt.Print(prompt, " ") + + scanner := bufio.NewScanner(os.Stdin) + var response string + if scanner.Scan() { + response = scanner.Text() + } + + return response +} diff --git a/sevenkeys/main.go b/sevenkeys/main.go index 5fbbd0f..04487c5 100644 --- a/sevenkeys/main.go +++ b/sevenkeys/main.go @@ -5,7 +5,6 @@ import ( "sevenkeys/database" "sevenkeys/logic" "sevenkeys/logic/scryfall" - "time" "github.com/inancgumus/screen" ) @@ -40,13 +39,38 @@ func main() { fmt.Println("No update required.") } - storageLocation := logic.GetStorageLocation() + storageBox := logic.GetResponse("Enter storage box label:") + source := logic.GetResponse("Enter source:") + searchOptions, err := logic.GetAllSearchOptions(db) + logic.Check(err) for { screen.Clear() screen.MoveTopLeft() - fmt.Println("Current storage location:", storageLocation) + fmt.Println("Storage location:", storageBox) + fmt.Println("Source:", source) - time.Sleep(1 * time.Second) + selectedCardPrintingId, selectedSearchOption, err := logic.Search(searchOptions) + logic.Check(err) + + fmt.Println("Inserted card:", selectedSearchOption) + storageLocation := database.CardStorageLocation{ + CardPrintingId: selectedCardPrintingId, + StorageBox: storageBox, + Source: source, + } + err = logic.StoreCard(db, storageLocation) + logic.Check(err) + + nextAction := logic.GetResponse("[s]earch again/[r]epeat last insert/[q]uit:") + switch nextAction { + case "s": + continue + case "r": + err = logic.StoreCard(db, storageLocation) + logic.Check(err) + case "q": + break + } } } diff --git a/sevenkeys/printinglist.go b/sevenkeys/printinglist.go deleted file mode 100644 index 2af5605..0000000 --- a/sevenkeys/printinglist.go +++ /dev/null @@ -1,27 +0,0 @@ -package main - -/* -func main() { - db := database.GetDatabaseFromConfig("config.json") - cardSearchOptions, err := operations.GetCardSearchOptions(db) - check(err) - - cmd := exec.Command("fzf") - cmd.Stderr = os.Stderr - - fzfStdin, err := cmd.StdinPipe() - check(err) - - go func() { - defer fzfStdin.Close() - for _, option := range cardSearchOptions { - io.WriteString(fzfStdin, option+"\n") - } - }() - - fzfOutput, err := cmd.Output() - check(err) - - fmt.Println("Output:", string(fzfOutput)) -} -*/