package cli import ( "fmt" "strings" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" "github.com/hachem-wtf/benson/internal/config" ) func defaultCommands() []command { return []command{ { name: "list-mods", desc: "List the configured mods", run: func(m *model) tea.Cmd { return tea.Println(renderModList(m.cfg)) }, }, { name: "check", desc: "Check whether the configured mods are compatible", run: runCheck, }, { name: "generate", desc: "Download the server and mods and generate a server directory", run: runGenerate, }, { name: "help", desc: "Show available commands", run: func(m *model) tea.Cmd { return tea.Println(helpBlock(m.commands)) }, }, } } func welcomeBlock(cfg *config.Config, version string) string { header := lipgloss.JoinHorizontal( lipgloss.Bottom, titleStyle.Render("BENSON"), subtitleStyle.Render(" v"+version), ) inner := lipgloss.JoinVertical( lipgloss.Left, header, mutedStyle.Render("Fabric · MC "+cfg.MinecraftVersion), ) hint := mutedStyle.Render("Tab autocompletes · Ctrl+C quits") return lipgloss.JoinVertical(lipgloss.Left, bannerStyle.Render(inner), "", hint) } func helpBlock(cmds []command) string { rows := []string{headingStyle.Render("Commands"), ""} for _, c := range cmds { rows = append(rows, " "+bulletStyle.Render(padRight(c.name, 14))+mutedStyle.Render(c.desc)) } rows = append(rows, " "+bulletStyle.Render(padRight("exit", 14))+mutedStyle.Render("Exit Benson")) return lipgloss.JoinVertical(lipgloss.Left, rows...) } func renderModList(cfg *config.Config) string { rows := []string{ headingStyle.Render(fmt.Sprintf("Mods for MC %s", cfg.MinecraftVersion)), "", } if len(cfg.ModrinthMods) == 0 { rows = append(rows, mutedStyle.Render(" (none configured)")) } for _, slug := range cfg.ModrinthMods { rows = append(rows, " "+bulletStyle.Render("◆ ")+slug) } rows = append(rows, "", mutedStyle.Render(fmt.Sprintf("Total: %d mods", len(cfg.ModrinthMods)))) return lipgloss.JoinVertical(lipgloss.Left, rows...) } func padRight(s string, n int) string { if pad := n - len([]rune(s)); pad > 0 { return s + strings.Repeat(" ", pad) } return s }