package cli import ( "encoding/json" "fmt" "text/tabwriter" "github.com/spf13/cobra" ) func newResolveCmd(opts *options) *cobra.Command { var asJSON bool cmd := &cobra.Command{ Use: "resolve", Short: "List the extensions the config resolves to, in merge order", Long: `Resolve fetches each extension in the config and its dependencies, and prints them in the order their patches are applied. Dependencies come first. Nothing is generated.`, Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, _ []string) error { cfg, g, err := opts.setup(cmd) if err != nil { return err } exts, err := g.Resolve(cfg.Extensions) if err != nil { return err } if asJSON { type row struct { Name string `json:"name"` URL string `json:"url"` Declared bool `json:"declared"` Dependencies []string `json:"dependencies,omitempty"` } rows := make([]row, len(exts)) for i, e := range exts { rows[i] = row{e.Name, e.URL, e.Declared, e.Dependencies} } enc := json.NewEncoder(cmd.OutOrStdout()) enc.SetIndent("", " ") if err := enc.Encode(rows); err != nil { return err } } else { w := tabwriter.NewWriter(cmd.OutOrStdout(), 0, 0, 2, ' ', 0) fmt.Fprintln(w, "#\tNAME\tSOURCE\tURL") for i, e := range exts { src := "dependency" if e.Declared { src = "declared" } fmt.Fprintf(w, "%d\t%s\t%s\t%s\n", i+1, e.Name, src, e.URL) } if err := w.Flush(); err != nil { return err } } return opts.finish(g) }, } cmd.Flags().BoolVar(&asJSON, "json", false, "print as JSON") return cmd }