feat: Add aliases to commands

master
Ivan Klymenchenko 2 years ago committed by Ivan
parent d053a9d41a
commit 4da0e2d368

@ -16,7 +16,59 @@ const (
CommandPrint = "print" CommandPrint = "print"
) )
var validCommands = []string{CommandStart, CommandStop, CommandNew, CommandEdit, CommandList, CommandPrint} type command struct {
Name string
Aliases []string
}
type commands []command
var Commands = commands{
{
Name: CommandStart,
Aliases: []string{},
},
{
Name: CommandStop,
Aliases: []string{"s", "st"},
},
{
Name: CommandNew,
Aliases: []string{"n"},
},
{
Name: CommandEdit,
Aliases: []string{"e"},
},
{
Name: CommandList,
Aliases: []string{"l"},
},
{
Name: CommandPrint,
Aliases: []string{"p"},
},
}
func (c *commands) Resolve(v string) (*command, error) {
for _, cmd := range *c {
if cmd.Name == v || Contains(cmd.Aliases, v) {
return &cmd, nil
}
}
return nil, ErrCommandNotFound
}
func (c *commands) FindByName(n string) *command {
for _, cmd := range *c {
if cmd.Name == n {
return &cmd
}
}
return nil
}
type Options struct { type Options struct {
Command string Command string
@ -31,6 +83,7 @@ type Options struct {
} }
var ErrHelp = errors.New("help requested") var ErrHelp = errors.New("help requested")
var ErrCommandNotFound = errors.New("command not found")
const ( const (
WindowsUsage = "List of windows to start. If session exists, those windows will be attached to current session" WindowsUsage = "List of windows to start. If session exists, those windows will be attached to current session"
@ -59,13 +112,12 @@ func ParseOptions(argv []string, helpRequested func()) (Options, error) {
return Options{}, ErrHelp return Options{}, ErrHelp
} }
cmd := argv[0] cmd, cmdErr := Commands.Resolve(argv[0])
if !Contains(validCommands, cmd) { if errors.Is(cmdErr, ErrCommandNotFound) {
helpRequested() cmd = Commands.FindByName(CommandStart)
return Options{}, ErrHelp
} }
flags := NewFlagSet(cmd) flags := NewFlagSet(cmd.Name)
config := flags.StringP("file", "f", "", FileUsage) config := flags.StringP("file", "f", "", FileUsage)
windows := flags.StringArrayP("windows", "w", []string{}, WindowsUsage) windows := flags.StringArrayP("windows", "w", []string{}, WindowsUsage)
@ -75,7 +127,6 @@ func ParseOptions(argv []string, helpRequested func()) (Options, error) {
insideCurrentSession := flags.BoolP("inside-current-session", "i", false, InsideCurrentSessionUsage) insideCurrentSession := flags.BoolP("inside-current-session", "i", false, InsideCurrentSessionUsage)
err := flags.Parse(argv) err := flags.Parse(argv)
if err == pflag.ErrHelp { if err == pflag.ErrHelp {
return Options{}, ErrHelp return Options{}, ErrHelp
} }
@ -85,8 +136,12 @@ func ParseOptions(argv []string, helpRequested func()) (Options, error) {
} }
var project string var project string
if *config == "" && len(argv) > 1 { if *config == "" {
project = argv[1] if errors.Is(cmdErr, ErrCommandNotFound) {
project = argv[0]
} else if len(argv) > 1 {
project = argv[1]
}
} }
if strings.Contains(project, ":") { if strings.Contains(project, ":") {
@ -111,7 +166,7 @@ func ParseOptions(argv []string, helpRequested func()) (Options, error) {
return Options{ return Options{
Project: project, Project: project,
Config: *config, Config: *config,
Command: cmd, Command: cmd.Name,
Settings: settings, Settings: settings,
Windows: *windows, Windows: *windows,
Attach: *attach, Attach: *attach,

@ -181,9 +181,25 @@ var usageTestTable = []struct {
}, },
{ {
[]string{"test"}, []string{"test"},
Options{}, Options{
ErrHelp, Command: "start",
1, Project: "test",
Windows: []string{},
Settings: map[string]string{},
},
nil,
0,
},
{
[]string{"test", "-w", "win1", "-w", "win2", "a=b", "x=y"},
Options{
Command: "start",
Project: "test",
Windows: []string{"win1", "win2"},
Settings: map[string]string{"a": "b", "x": "y"},
},
nil,
0,
}, },
{ {
[]string{}, []string{},

Loading…
Cancel
Save