board.go

  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}