From fa03de4695c21257f185a5b26c19b92fbc956ff0 Mon Sep 17 00:00:00 2001 From: Theis Date: Fri, 11 Oct 2024 11:21:39 +0200 Subject: [PATCH] feat: add tui show users (WIP) and prefer bat if present --- src_code/go_src/cmd/tui/tui_show_users.go | 106 ++++++++++++++++++++++ src_code/go_src/cmd/users.go | 37 ++++++-- 2 files changed, 133 insertions(+), 10 deletions(-) create mode 100644 src_code/go_src/cmd/tui/tui_show_users.go diff --git a/src_code/go_src/cmd/tui/tui_show_users.go b/src_code/go_src/cmd/tui/tui_show_users.go new file mode 100644 index 0000000..92f4770 --- /dev/null +++ b/src_code/go_src/cmd/tui/tui_show_users.go @@ -0,0 +1,106 @@ +package tui + +import ( + "bufio" + "fmt" + "os" + "strings" + + "github.com/charmbracelet/bubbles/viewport" + tea "github.com/charmbracelet/bubbletea" + "github.com/charmbracelet/glamour" + "github.com/charmbracelet/lipgloss" +) + +//TODO: MAybe change away from glamour if the weird email issue can't be solved + +var content string + +var helpStyle_us = lipgloss.NewStyle().Foreground(lipgloss.Color("241")).Render + +type example struct { + viewport viewport.Model +} + +func newExample() (*example, error) { + const width = 78 + + vp := viewport.New(width, 20) + vp.Style = lipgloss.NewStyle(). + BorderStyle(lipgloss.RoundedBorder()). + BorderForeground(lipgloss.Color("62")). + PaddingRight(2) + + renderer, err := glamour.NewTermRenderer( + glamour.WithPreservedNewLines(), + glamour.WithAutoStyle(), + glamour.WithWordWrap(width), + ) + if err != nil { + return nil, err + } + + str, err := renderer.Render(content) + if err != nil { + return nil, err + } + + vp.SetContent(str) + + return &example{ + viewport: vp, + }, nil +} + +func (e example) Init() tea.Cmd { + return nil +} + +func (e example) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + switch msg := msg.(type) { + case tea.KeyMsg: + switch msg.String() { + case "q", "ctrl+c", "esc": + return e, tea.Quit + default: + var cmd tea.Cmd + e.viewport, cmd = e.viewport.Update(msg) + return e, cmd + } + default: + return e, nil + } +} + +func (e example) View() string { + return e.viewport.View() + e.helpView() +} + +func (e example) helpView() string { + return helpStyle_us("\n ↑/↓: Navigate • q: Quit\n") +} + +func Entry_US(author_file string) { + file, err := os.Open(author_file) + + scanner := bufio.NewScanner(file) + var cnt strings.Builder + + for scanner.Scan() { + cnt.WriteString(scanner.Text() + "\n") + } + + + content = cnt.String() + + model, err := newExample() + if err != nil { + fmt.Println("Could not initialize Bubble Tea model:", err) + os.Exit(1) + } + + if _, err := tea.NewProgram(model).Run(); err != nil { + fmt.Println("Bummer, there's been an error:", err) + os.Exit(1) + } +} \ No newline at end of file diff --git a/src_code/go_src/cmd/users.go b/src_code/go_src/cmd/users.go index 6fef0d3..4277858 100644 --- a/src_code/go_src/cmd/users.go +++ b/src_code/go_src/cmd/users.go @@ -1,8 +1,10 @@ package cmd import ( + "main/src_code/go_src/cmd/tui" "main/src_code/go_src/cmd/utils" "os" + "os/exec" "slices" "sort" "strings" @@ -19,21 +21,36 @@ var usersCmd = &cobra.Command{ Long: `Displays all users from the author file located at: ` + authorfile, Run: func(cmd *cobra.Command, args []string) { //TODO: make this print a bit prettier (sort it and maybe use a table) - println("List of users:\nFormat: / -> Username: Email: ") - seen_users := []utils.User{} - user_sb := []string{} - for name, usr := range utils.Users { - if !slices.Contains(seen_users, usr) { - user_sb = append(user_sb, utils.Users[name].Names+" ->"+" Username: "+usr.Username+" Email: "+usr.Email+"\n") - seen_users = append(seen_users, usr) + // check if the no pretty print flag is set + np, _ := cmd.Flags().GetBool("np") + if np { + println("List of users:\nFormat: / -> Username: Email: ") + seen_users := []utils.User{} + user_sb := []string{} + for name, usr := range utils.Users { + if !slices.Contains(seen_users, usr) { + user_sb = append(user_sb, utils.Users[name].Names+" ->"+" Username: "+usr.Username+" Email: "+usr.Email+"\n") + seen_users = append(seen_users, usr) + } } + sort.Strings(user_sb) + println(strings.Join(user_sb, "")) + os.Exit(1) } - sort.Strings(user_sb) - println(strings.Join(user_sb, "")) - os.Exit(1) + bat_check := exec.Command("which", "bat") + out, _ := bat_check.CombinedOutput() + if string(out) == "" { + tui.Entry_US(authorfile) + os.Exit(0) + } + bat := exec.Command("bat", authorfile) + bat.Stdout = os.Stdout + bat.Stderr = os.Stderr + bat.Run() }, } func init() { rootCmd.AddCommand(usersCmd) + usersCmd.Flags().BoolP("np", "n", false, "No pretty print of the users") }