Files
evm/commands/list.go

80 lines
1.7 KiB
Go

package commands
import (
"strings"
"github.com/jimeh/evm/manager"
"github.com/jimeh/go-render"
"github.com/spf13/cobra"
)
func NewList(mgr *manager.Manager) (*cobra.Command, error) {
cmd := &cobra.Command{
Use: "list",
Short: "List all Emacs versions found in " +
"`$EVM_ROOT/versions/*'",
Aliases: []string{"ls", "versions"},
Args: cobra.ExactArgs(0),
ValidArgsFunction: noValidArgs,
RunE: listRunE(mgr),
}
cmd.Flags().StringP(
"format", "f", "text", "output format ,\"text\", \"yaml\", or \"json\"",
)
return cmd, nil
}
func listRunE(mgr *manager.Manager) runEFunc {
return func(cmd *cobra.Command, _ []string) error {
format := flagString(cmd, "format")
versions, err := mgr.List(cmd.Context())
if err != nil {
return err
}
output := &listOutput{
Current: listOutputCurrent{
Version: mgr.CurrentVersion(),
SetBy: mgr.CurrentSetBy(),
},
Versions: versions,
}
return render.Pretty(cmd.OutOrStdout(), format, output)
}
}
type listOutput struct {
Current listOutputCurrent `yaml:"current" json:"current"`
Versions []*manager.Version `yaml:"versions" json:"versions"`
}
type listOutputCurrent struct {
Version string `yaml:"version" json:"version"`
SetBy string `yaml:"set_by,omitempty" json:"set_by,omitempty"`
}
func (lo *listOutput) String() string {
buf := &strings.Builder{}
for _, ver := range lo.Versions {
if lo.Current.Version == ver.Version {
buf.WriteString("* ")
} else {
buf.WriteString(" ")
}
buf.WriteString(ver.Version)
if lo.Current.Version == ver.Version && lo.Current.SetBy != "" {
buf.WriteString(" (set by " + lo.Current.SetBy + ")")
}
buf.WriteByte('\n')
}
return buf.String()
}