package dap import ( "bytes" "errors" "fmt" "sort" "strings" "github.com/go-delve/delve/pkg/config" ) func (s *Session) delveCmd(goid, frame int, cmdstr string) (string, error) { vals := strings.SplitN(strings.TrimSpace(cmdstr), " ", 2) cmdname := vals[0] var args string if len(vals) > 1 { args = strings.TrimSpace(vals[1]) } for _, cmd := range debugCommands(s) { for _, alias := range cmd.aliases { if alias == cmdname { return cmd.cmdFn(goid, frame, args) } } } return "", errNoCmd } type cmdfunc func(goid, frame int, args string) (string, error) type command struct { aliases []string helpMsg string cmdFn cmdfunc } const ( msgHelp = `Prints the help message. dlv help [command] Type "help" followed by the name of a command for more information about it.` msgConfig = `Changes configuration parameters. dlv config -list Show all configuration parameters. dlv config Changes the value of a configuration parameter. dlv config substitutePath dlv config substitutePath Adds or removes a path substitution rule.` msgSources = `Print list of source files. dlv sources [] If regex is specified only the source files matching it will be returned.` ) // debugCommands returns a list of commands with default commands defined. func debugCommands(s *Session) []command { return []command{ {aliases: []string{"help", "h"}, cmdFn: s.helpMessage, helpMsg: msgHelp}, {aliases: []string{"config"}, cmdFn: s.evaluateConfig, helpMsg: msgConfig}, {aliases: []string{"sources", "s"}, cmdFn: s.sources, helpMsg: msgSources}, } } var errNoCmd = errors.New("command not available") func (s *Session) helpMessage(_, _ int, args string) (string, error) { var buf bytes.Buffer if args != "" { for _, cmd := range debugCommands(s) { for _, alias := range cmd.aliases { if alias == args { return cmd.helpMsg, nil } } } return "", errNoCmd } fmt.Fprintln(&buf, "The following commands are available:") for _, cmd := range debugCommands(s) { h := cmd.helpMsg if idx := strings.Index(h, "\n"); idx >= 0 { h = h[:idx] } if len(cmd.aliases) > 1 { fmt.Fprintf(&buf, " dlv %s (alias: %s) \t %s\n", cmd.aliases[0], strings.Join(cmd.aliases[1:], " | "), h) } else { fmt.Fprintf(&buf, " dlv %s \t %s\n", cmd.aliases[0], h) } } fmt.Fprintln(&buf) fmt.Fprintln(&buf, "Type 'dlv help' followed by a command for full documentation.") return buf.String(), nil } func (s *Session) evaluateConfig(_, _ int, expr string) (string, error) { argv := config.Split2PartsBySpace(expr) name := argv[0] switch name { case "-list": return listConfig(&s.args), nil default: res, err := configureSet(&s.args, expr) if err != nil { return "", err } return res, nil } } func (s *Session) sources(_, _ int, filter string) (string, error) { sources, err := s.debugger.Sources(filter) if err != nil { return "", err } sort.Strings(sources) return strings.Join(sources, "\n"), nil }