Skip to content
Snippets Groups Projects
Unverified Commit e21eb5b0 authored by Kevin Lyda's avatar Kevin Lyda
Browse files

Move commands into a map.

parent 0b9c1fd7
No related branches found
No related tags found
No related merge requests found
...@@ -11,17 +11,16 @@ type ActionFunc func(*Command) error ...@@ -11,17 +11,16 @@ type ActionFunc func(*Command) error
// Flag is a flag for a command. // Flag is a flag for a command.
type Flag struct { type Flag struct {
Name string
Value string Value string
Default string
Description string Description string
} }
// Flags is the list of flags. // Flags is the list of flags.
type Flags []*Flag type Flags map[string]*Flag
// Command contains the definition of a command, it's flags and subcommands. // Command contains the definition of a command, it's flags and subcommands.
type Command struct { type Command struct {
Command string
Flags Flags Flags Flags
Args []string Args []string
Commands []*Command Commands []*Command
...@@ -30,24 +29,54 @@ type Command struct { ...@@ -30,24 +29,54 @@ type Command struct {
} }
// Commands is the full list of commands. // Commands is the full list of commands.
type Commands []*Command type Commands map[string]*Command
// ParseAndRun parses a command line and runs the command. // ParseAndRun parses a command line and runs the command.
func (c Commands) ParseAndRun(line string) error { func (c Commands) ParseAndRun(line string) error {
// TODO: this doesn't handle a DCL command line completely. // TODO: this doesn't handle a DCL command line completely.
words := strings.Fields(line) words := strings.Fields(line)
fmt.Printf("TODO ParseAndRun need to parse flags: %s\n", words) fmt.Printf("TODO ParseAndRun need to parse flags: %s\n", words)
cmd := strings.ToUpper(words[0]) cmd, ok := c[strings.ToUpper(words[0])]
for i := range c { if !ok {
if c[i].Command == cmd { fmt.Printf("ERROR: Unknown command '%s'\n", words[0])
if c[i].Action == nil {
fmt.Printf("Command not implemented:\n%s\n", c[i].Description)
return nil return nil
} }
err := c[i].Action(c[i]) if cmd.Action == nil {
return err fmt.Printf("ERROR: Command not implemented:\n%s\n", cmd.Description)
return nil
} }
for flg := range cmd.Flags {
cmd.Flags[flg].Value = cmd.Flags[flg].Default
} }
fmt.Printf("ERROR: Unknown command '%s'\n", cmd) cmd.Args = []string{}
return nil if len(words) == 1 {
return cmd.Action(cmd)
}
for i := range words[1:] {
if strings.HasPrefix(words[i], "/") {
flag, val, assigned := strings.Cut(words[i], "=")
if assigned {
wordup := strings.ToUpper(flag)
flg, ok := cmd.Flags[wordup]
if !ok {
fmt.Printf("ERROR: Flag '%s' not recognised.", words[i])
}
flg.Value = val
} else {
// TODO: handle toggle flag.
wordup := strings.ToUpper(words[i])
value := "true"
if strings.HasPrefix(wordup, "/NO") {
wordup = strings.Replace(wordup, "/NO", "/", 1)
value = "false"
}
flg, ok := cmd.Flags[wordup]
if !ok {
fmt.Printf("ERROR: Flag '%s' not recognised.", words[i])
}
flg.Value = value
}
}
}
return cmd.Action(cmd)
} }
// Package repl implements the main event loop.
package repl
import (
"git.lyda.ie/kevin/bulletin/dclish"
)
// ActionHelp handles the `HELP` command.
func ActionHelp(_ *dclish.Command) error {
return nil
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment