user.go

 1package usercmd
 2
 3import (
 4	"encoding/json"
 5	"fmt"
 6
 7	"github.com/spf13/cobra"
 8
 9	json2 "github.com/MichaelMure/git-bug/commands/cmdjson"
10
11	"github.com/MichaelMure/git-bug/cache"
12	"github.com/MichaelMure/git-bug/commands/completion"
13	"github.com/MichaelMure/git-bug/commands/execenv"
14	"github.com/MichaelMure/git-bug/util/colors"
15)
16
17type userOptions struct {
18	format string
19}
20
21func NewUserCommand() *cobra.Command {
22	env := execenv.NewEnv()
23	options := userOptions{}
24
25	cmd := &cobra.Command{
26		Use:     "user",
27		Short:   "List identities",
28		PreRunE: execenv.LoadBackend(env),
29		RunE: execenv.CloseBackend(env, func(cmd *cobra.Command, args []string) error {
30			return runUser(env, options)
31		}),
32	}
33
34	cmd.AddCommand(newUserNewCommand())
35	cmd.AddCommand(newUserShowCommand())
36	cmd.AddCommand(newUserAdoptCommand())
37
38	flags := cmd.Flags()
39	flags.SortFlags = false
40
41	flags.StringVarP(&options.format, "format", "f", "default",
42		"Select the output formatting style. Valid values are [default,json]")
43	cmd.RegisterFlagCompletionFunc("format", completion.From([]string{"default", "json"}))
44
45	return cmd
46}
47
48func runUser(env *execenv.Env, opts userOptions) error {
49	ids := env.Backend.AllIdentityIds()
50	var users []*cache.IdentityExcerpt
51	for _, id := range ids {
52		user, err := env.Backend.ResolveIdentityExcerpt(id)
53		if err != nil {
54			return err
55		}
56		users = append(users, user)
57	}
58
59	switch opts.format {
60	case "json":
61		return userJsonFormatter(env, users)
62	case "default":
63		return userDefaultFormatter(env, users)
64	default:
65		return fmt.Errorf("unknown format %s", opts.format)
66	}
67}
68
69func userDefaultFormatter(env *execenv.Env, users []*cache.IdentityExcerpt) error {
70	for _, user := range users {
71		env.Out.Printf("%s %s\n",
72			colors.Cyan(user.Id.Human()),
73			user.DisplayName(),
74		)
75	}
76
77	return nil
78}
79
80func userJsonFormatter(env *execenv.Env, users []*cache.IdentityExcerpt) error {
81	jsonUsers := make([]json2.Identity, len(users))
82	for i, user := range users {
83		jsonUsers[i] = json2.NewIdentityFromExcerpt(user)
84	}
85
86	jsonObject, _ := json.MarshalIndent(jsonUsers, "", "    ")
87	env.Out.Printf("%s\n", jsonObject)
88	return nil
89}