If the argument isn't an ID, use fzf to find an ID

Signed-off-by: Oliver Davies <oliver@oliverdavies.uk>
This commit is contained in:
Oliver Davies 2025-09-30 22:43:12 +01:00
parent 329d6d34e0
commit 3c7a1dc3c1
5 changed files with 118 additions and 20 deletions

9
internal/lib/ansi.go Normal file
View file

@ -0,0 +1,9 @@
package lib
import "regexp"
var ansiRegex = regexp.MustCompile(`\x1b\[[0-9;]*m`)
func StripANSI(s string) string {
return ansiRegex.ReplaceAllString(s, "")
}

34
internal/lib/fzf.go Normal file
View file

@ -0,0 +1,34 @@
package lib
import (
"bytes"
"os"
"os/exec"
"strings"
)
func SelectWithFzf(items []string) (string, error) {
cmd := exec.Command("fzf", "--ansi")
var input bytes.Buffer
for _, item := range items {
input.WriteString(item + "\n")
}
cmd.Stdin = &input
var output bytes.Buffer
cmd.Stdout = &output
cmd.Stderr = os.Stderr
err := cmd.Run()
if err != nil {
return "", err
}
selected := strings.TrimSpace(output.String())
return selected, nil
}

View file

@ -3,13 +3,10 @@ package lib
import (
"encoding/json"
"fmt"
"regexp"
"strconv"
"strings"
)
var ansiRegex = regexp.MustCompile(`\x1b\[[0-9;]*m`)
type Item struct {
ID int `json:"id"`
Title string `json:"title"`
@ -19,7 +16,7 @@ func AsJSON(zets []string) (string, error) {
var items []Item
for _, entry := range zets {
cleanEntry := stripANSI(entry)
cleanEntry := StripANSI(entry)
parts := strings.SplitN(cleanEntry, " ", 2)
id, _ := strconv.Atoi(parts[0])
@ -42,7 +39,3 @@ func AsJSON(zets []string) (string, error) {
return string(jsonData), nil
}
func stripANSI(s string) string {
return ansiRegex.ReplaceAllString(s, "")
}