From 24bd593dd919d8948d2b37eb3ce09a14a506e7a1 Mon Sep 17 00:00:00 2001 From: Dan Anglin Date: Sat, 8 Jun 2024 19:00:51 +0100 Subject: [PATCH] feat: add pager support --- cmd/enbas/main.go | 2 ++ internal/executor/create.go | 4 +-- internal/executor/edit.go | 2 +- internal/executor/flags.go | 1 + internal/executor/show.go | 26 +++++++++---------- internal/model/status.go | 2 +- internal/utilities/displayer.go | 44 ++++++++++++++++++++++++++++++--- 7 files changed, 61 insertions(+), 20 deletions(-) diff --git a/cmd/enbas/main.go b/cmd/enbas/main.go index 2b0b364..6f70d71 100644 --- a/cmd/enbas/main.go +++ b/cmd/enbas/main.go @@ -65,6 +65,7 @@ func run() error { topLevelFlags := executor.TopLevelFlags{ ConfigDir: "", NoColor: nil, + Pager: "", } flag.StringVar(&topLevelFlags.ConfigDir, "config-dir", "", "specify your config directory") @@ -79,6 +80,7 @@ func run() error { return nil }) + flag.StringVar(&topLevelFlags.Pager, "pager", "", "specify your preferred pager if you would like pager support") flag.Usage = usageFunc(commandSummaries) diff --git a/internal/executor/create.go b/internal/executor/create.go index 84c2793..d4c1308 100644 --- a/internal/executor/create.go +++ b/internal/executor/create.go @@ -116,7 +116,7 @@ func (c *CreateExecutor) createList(gtsClient *client.Client) error { } fmt.Println("Successfully created the following list:") - utilities.Display(list, *c.topLevelFlags.NoColor) + utilities.Display(list, *c.topLevelFlags.NoColor, c.topLevelFlags.Pager) return nil } @@ -197,7 +197,7 @@ func (c *CreateExecutor) createStatus(gtsClient *client.Client) error { } fmt.Println("Successfully created the following status:") - utilities.Display(status, *c.topLevelFlags.NoColor) + utilities.Display(status, *c.topLevelFlags.NoColor, c.topLevelFlags.Pager) return nil } diff --git a/internal/executor/edit.go b/internal/executor/edit.go index f21b233..aae961a 100644 --- a/internal/executor/edit.go +++ b/internal/executor/edit.go @@ -90,7 +90,7 @@ func (e *EditExecutor) editList(gtsClient *client.Client) error { } fmt.Println("Successfully updated the list.") - utilities.Display(updatedList, *e.topLevelFlags.NoColor) + utilities.Display(updatedList, *e.topLevelFlags.NoColor, e.topLevelFlags.Pager) return nil } diff --git a/internal/executor/flags.go b/internal/executor/flags.go index f617224..c38e03f 100644 --- a/internal/executor/flags.go +++ b/internal/executor/flags.go @@ -23,4 +23,5 @@ func (a *AccountNames) Set(value string) error { type TopLevelFlags struct { ConfigDir string NoColor *bool + Pager string } diff --git a/internal/executor/show.go b/internal/executor/show.go index 10a7069..3a927ff 100644 --- a/internal/executor/show.go +++ b/internal/executor/show.go @@ -90,7 +90,7 @@ func (s *ShowExecutor) showInstance(gtsClient *client.Client) error { return fmt.Errorf("unable to retrieve the instance details: %w", err) } - utilities.Display(instance, *s.topLevelFlags.NoColor) + utilities.Display(instance, *s.topLevelFlags.NoColor, s.topLevelFlags.Pager) return nil } @@ -123,7 +123,7 @@ func (s *ShowExecutor) showAccount(gtsClient *client.Client) error { return nil } - utilities.Display(account, *s.topLevelFlags.NoColor) + utilities.Display(account, *s.topLevelFlags.NoColor, s.topLevelFlags.Pager) if !s.myAccount && !s.skipAccountRelationship { relationship, err := gtsClient.GetAccountRelationship(account.ID) @@ -131,7 +131,7 @@ func (s *ShowExecutor) showAccount(gtsClient *client.Client) error { return fmt.Errorf("unable to retrieve the relationship to this account: %w", err) } - utilities.Display(relationship, *s.topLevelFlags.NoColor) + utilities.Display(relationship, *s.topLevelFlags.NoColor, s.topLevelFlags.Pager) } if s.myAccount && s.showUserPreferences { @@ -140,7 +140,7 @@ func (s *ShowExecutor) showAccount(gtsClient *client.Client) error { return fmt.Errorf("unable to retrieve the user preferences: %w", err) } - utilities.Display(preferences, *s.topLevelFlags.NoColor) + utilities.Display(preferences, *s.topLevelFlags.NoColor, s.topLevelFlags.Pager) } return nil @@ -162,7 +162,7 @@ func (s *ShowExecutor) showStatus(gtsClient *client.Client) error { return nil } - utilities.Display(status, *s.topLevelFlags.NoColor) + utilities.Display(status, *s.topLevelFlags.NoColor, s.topLevelFlags.Pager) return nil } @@ -211,7 +211,7 @@ func (s *ShowExecutor) showTimeline(gtsClient *client.Client) error { return nil } - utilities.Display(timeline, *s.topLevelFlags.NoColor) + utilities.Display(timeline, *s.topLevelFlags.NoColor, s.topLevelFlags.Pager) return nil } @@ -240,7 +240,7 @@ func (s *ShowExecutor) showList(gtsClient *client.Client) error { list.Accounts = accountMap } - utilities.Display(list, *s.topLevelFlags.NoColor) + utilities.Display(list, *s.topLevelFlags.NoColor, s.topLevelFlags.Pager) return nil } @@ -257,7 +257,7 @@ func (s *ShowExecutor) showLists(gtsClient *client.Client) error { return nil } - utilities.Display(lists, *s.topLevelFlags.NoColor) + utilities.Display(lists, *s.topLevelFlags.NoColor, s.topLevelFlags.Pager) return nil } @@ -274,7 +274,7 @@ func (s *ShowExecutor) showFollowers(gtsClient *client.Client) error { } if len(followers.Accounts) > 0 { - utilities.Display(followers, *s.topLevelFlags.NoColor) + utilities.Display(followers, *s.topLevelFlags.NoColor, s.topLevelFlags.Pager) } else { fmt.Println("There are no followers for this account or the list is hidden.") } @@ -294,7 +294,7 @@ func (s *ShowExecutor) showFollowing(gtsClient *client.Client) error { } if len(following.Accounts) > 0 { - utilities.Display(following, *s.topLevelFlags.NoColor) + utilities.Display(following, *s.topLevelFlags.NoColor, s.topLevelFlags.Pager) } else { fmt.Println("This account is not following anyone or the list is hidden.") } @@ -309,7 +309,7 @@ func (s *ShowExecutor) showBlocked(gtsClient *client.Client) error { } if len(blocked.Accounts) > 0 { - utilities.Display(blocked, *s.topLevelFlags.NoColor) + utilities.Display(blocked, *s.topLevelFlags.NoColor, s.topLevelFlags.Pager) } else { fmt.Println("You have no blocked accounts.") } @@ -324,7 +324,7 @@ func (s *ShowExecutor) showBookmarks(gtsClient *client.Client) error { } if len(bookmarks.Statuses) > 0 { - utilities.Display(bookmarks, *s.topLevelFlags.NoColor) + utilities.Display(bookmarks, *s.topLevelFlags.NoColor, s.topLevelFlags.Pager) } else { fmt.Println("You have no bookmarks.") } @@ -339,7 +339,7 @@ func (s *ShowExecutor) showLiked(gtsClient *client.Client) error { } if len(liked.Statuses) > 0 { - utilities.Display(liked, *s.topLevelFlags.NoColor) + utilities.Display(liked, *s.topLevelFlags.NoColor, s.topLevelFlags.Pager) } else { fmt.Printf("You have no %s statuses.\n", s.resourceType) } diff --git a/internal/model/status.go b/internal/model/status.go index a534215..09befcd 100644 --- a/internal/model/status.go +++ b/internal/model/status.go @@ -209,7 +209,7 @@ type StatusList struct { func (s StatusList) Display(noColor bool) string { var builder strings.Builder - separator := "────────────────────────────────────────────────────────────────────────────────" + separator := strings.Repeat("─", 80) builder.WriteString(utilities.HeaderFormat(noColor, s.Name) + "\n") diff --git a/internal/utilities/displayer.go b/internal/utilities/displayer.go index 198337a..cd87ad5 100644 --- a/internal/utilities/displayer.go +++ b/internal/utilities/displayer.go @@ -4,12 +4,50 @@ package utilities -import "os" +import ( + "fmt" + "os" + "os/exec" + "strings" +) type Displayer interface { Display(noColor bool) string } -func Display(d Displayer, noColor bool) { - os.Stdout.WriteString(d.Display(noColor) + "\n") +func Display(displayer Displayer, noColor bool, pagerCommand string) { + if pagerCommand == "" { + os.Stdout.WriteString(displayer.Display(noColor) + "\n") + + return + } + + strArr := strings.Split(pagerCommand, " ") + + pager := new(exec.Cmd) + + if len(strArr) == 1 { + pager = exec.Command(strArr[0]) //nolint:gosec + } else { + pager = exec.Command(strArr[0], strArr[1:]...) //nolint:gosec + } + + pipe, err := pager.StdinPipe() + if err != nil { + os.Stdout.WriteString(displayer.Display(noColor) + "\n") + + return + } + + pager.Stdout = os.Stdout + pager.Stderr = os.Stderr + + _ = pager.Start() + + defer func() { + _ = pipe.Close() + _ = pager.Wait() + }() + + fmt.Fprintln(pipe, displayer.Display(noColor)+"\n") }