1package boardcmd
2
3import (
4 "fmt"
5 "strings"
6
7 text "github.com/MichaelMure/go-term-text"
8 "github.com/spf13/cobra"
9
10 "github.com/git-bug/git-bug/cache"
11 "github.com/git-bug/git-bug/commands/cmdjson"
12 "github.com/git-bug/git-bug/commands/completion"
13 "github.com/git-bug/git-bug/commands/execenv"
14 "github.com/git-bug/git-bug/util/colors"
15)
16
17type boardOptions struct {
18 metadataQuery []string
19 actorQuery []string
20 titleQuery []string
21 outputFormat string
22}
23
24func NewBoardCommand() *cobra.Command {
25 env := execenv.NewEnv()
26 options := boardOptions{}
27
28 cmd := &cobra.Command{
29 Use: "board",
30 Short: "List boards",
31 PreRunE: execenv.LoadBackend(env),
32 RunE: execenv.CloseBackend(env, func(cmd *cobra.Command, args []string) error {
33 return runBoard(env, options, args)
34 }),
35 }
36
37 flags := cmd.Flags()
38 flags.SortFlags = false
39
40 flags.StringSliceVarP(&options.metadataQuery, "metadata", "m", nil,
41 "Filter by metadata. Example: github-url=URL")
42 cmd.RegisterFlagCompletionFunc("author", completion.UserForQuery(env))
43 flags.StringSliceVarP(&options.actorQuery, "actor", "A", nil,
44 "Filter by actor")
45 cmd.RegisterFlagCompletionFunc("actor", completion.UserForQuery(env))
46 flags.StringSliceVarP(&options.titleQuery, "title", "t", nil,
47 "Filter by title")
48 flags.StringVarP(&options.outputFormat, "format", "f", "default",
49 "Select the output formatting style. Valid values are [default,plain,compact,id,json,org-mode]")
50 cmd.RegisterFlagCompletionFunc("format",
51 completion.From([]string{"default", "id", "json"}))
52
53 const selectGroup = "select"
54 cmd.AddGroup(&cobra.Group{ID: selectGroup, Title: "Implicit selection"})
55
56 addCmdWithGroup := func(child *cobra.Command, groupID string) {
57 cmd.AddCommand(child)
58 child.GroupID = groupID
59 }
60
61 addCmdWithGroup(newBoardDeselectCommand(), selectGroup)
62 addCmdWithGroup(newBoardSelectCommand(), selectGroup)
63
64 cmd.AddCommand(newBoardNewCommand())
65 cmd.AddCommand(newBoardRmCommand())
66 cmd.AddCommand(newBoardShowCommand())
67 cmd.AddCommand(newBoardDescriptionCommand())
68 cmd.AddCommand(newBoardTitleCommand())
69 cmd.AddCommand(newBoardAddDraftCommand())
70 cmd.AddCommand(newBoardAddBugCommand())
71
72 return cmd
73}
74
75func runBoard(env *execenv.Env, opts boardOptions, args []string) error {
76 // TODO: query
77
78 allIds := env.Backend.Boards().AllIds()
79
80 excerpts := make([]*cache.BoardExcerpt, len(allIds))
81 for i, id := range allIds {
82 b, err := env.Backend.Boards().ResolveExcerpt(id)
83 if err != nil {
84 return err
85 }
86 excerpts[i] = b
87 }
88
89 switch opts.outputFormat {
90 case "json":
91 return boardJsonFormatter(env, excerpts)
92 case "id":
93 return boardIDFormatter(env, excerpts)
94 case "default":
95 return boardDefaultFormatter(env, excerpts)
96 default:
97 return fmt.Errorf("unknown format %s", opts.outputFormat)
98 }
99}
100
101func boardIDFormatter(env *execenv.Env, excerpts []*cache.BoardExcerpt) error {
102 for _, b := range excerpts {
103 env.Out.Println(b.Id().String())
104 }
105
106 return nil
107}
108
109func boardDefaultFormatter(env *execenv.Env, excerpts []*cache.BoardExcerpt) error {
110 for _, b := range excerpts {
111 // truncate + pad if needed
112 titleFmt := text.LeftPadMaxLine(strings.TrimSpace(b.Title), 50, 0)
113 descFmt := text.LeftPadMaxLine(strings.TrimSpace(b.Description), 50, 0)
114
115 var itemFmt string
116 switch {
117 case b.ItemCount < 1:
118 itemFmt = "empty"
119 case b.ItemCount < 1000:
120 itemFmt = fmt.Sprintf("%3d 📝", b.ItemCount)
121 default:
122 itemFmt = " ∞ 📝"
123
124 }
125
126 env.Out.Printf("%s\t%s\t%s\t%s\n",
127 colors.Cyan(b.Id().Human()),
128 titleFmt,
129 descFmt,
130 itemFmt,
131 )
132 }
133 return nil
134}
135
136func boardJsonFormatter(env *execenv.Env, excerpts []*cache.BoardExcerpt) error {
137 res := make([]cmdjson.BoardExcerpt, len(excerpts))
138 for i, b := range excerpts {
139 jsonBoard, err := cmdjson.NewBoardExcerpt(env.Backend, b)
140 if err != nil {
141 return err
142 }
143 res[i] = jsonBoard
144 }
145 return env.Out.PrintJSON(res)
146}