mu-go/internal/shell/shell.go
Simon Vieille bfde701922
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
fix: handle input with several words
2026-02-14 23:24:37 +01:00

122 lines
2.1 KiB
Go

package shell
import (
"bufio"
"fmt"
"os"
"os/exec"
"strings"
"github.com/urfave/cli/v2"
"gitnet.fr/deblan/mu-go/internal/api"
"gitnet.fr/deblan/mu-go/internal/cmd"
"gitnet.fr/deblan/mu-go/internal/render"
)
type Shell struct {
Name string
Order string
Directory string
ApiUrl string
}
func NewShell(name, order, directory, apiUrl string) *Shell {
return &Shell{
Name: name,
Order: order,
Directory: directory,
ApiUrl: strings.TrimSuffix(apiUrl, "/"),
}
}
func (s *Shell) Prompt(defaultValue string) string {
reader := bufio.NewReader(os.Stdin)
fmt.Printf("> [%s] ", defaultValue)
input, _ := reader.ReadString('\n')
input = strings.Replace(input, "\n", "", -1)
if input == "" {
input = defaultValue
}
return input
}
func (s *Shell) Run(action string, args cli.Args) error {
directory := strings.TrimSuffix(s.Directory, "/")
files := api.RequestFileList(
s.ApiUrl,
s.Name,
s.Order,
)
var inputs []string
for i := 0; i < args.Len(); i++ {
arg := strings.Trim(args.Get(i), " \t\t\n")
if arg != "" {
inputs = append(inputs, arg)
}
}
input := strings.Join(inputs, " ")
switch input {
case "":
render.RenderFiles(files)
input = s.Prompt("1")
case "q":
return nil
}
files = files.Select(input)
if files.Empty() {
fmt.Println("Empty list, aborded!")
return nil
}
var commands []*exec.Cmd
switch action {
case "play":
commands = append(commands, cmd.PlayerCmd(files))
case "download":
commands = cmd.DownloadCmds(files, directory)
}
s.ExecCommands(commands)
return nil
}
func (s *Shell) ExecCommands(commands []*exec.Cmd) {
for _, cmd := range commands {
fmt.Printf("<----->\nCommand: %s\n<----->\n", cmd)
stdout, _ := cmd.StdoutPipe()
scanner := bufio.NewScanner(stdout)
cmd.Start()
for scanner.Scan() {
out := fmt.Sprintf("%q", scanner.Text())
out = strings.Trim(out, "\"")
out = strings.ReplaceAll(out, `\u00a0`, " ")
if out != "" {
fmt.Print("\r")
fmt.Print(out)
} else {
fmt.Print("\n")
}
}
}
for _, cmd := range commands {
cmd.Wait()
}
}