in cmd/viewcore/main.go [295:368]
func runRoot(cmd *cobra.Command, args []string) {
if cfg.corefile == "" {
cmd.Usage()
return
}
p, _, err := readCore()
if err != nil {
exitf("%v\n", err)
}
// Interactive mode.
cfg.interactive = true
// Create a dummy root to run in shell.
root := &cobra.Command{}
// Make all subcommands of viewcore available in the shell.
for _, subcmd := range cmd.Commands() {
if subcmd.Name() == "help" {
root.SetHelpCommand(subcmd)
continue
}
root.AddCommand(subcmd)
}
// Also, add exit command to terminate the shell.
root.AddCommand(&cobra.Command{
Use: "exit",
Aliases: []string{"quit", "bye"},
Short: "exit from interactive mode",
Run: func(*cobra.Command, []string) {
os.Exit(0)
},
})
rootCompleter := readline.NewPrefixCompleter()
for _, child := range root.Commands() {
cmdToCompleter(rootCompleter, child)
}
shell, err := readline.NewEx(&readline.Config{
Prompt: "(viewcore) ",
AutoComplete: rootCompleter,
EOFPrompt: "\n",
})
if err != nil {
panic(err)
}
defer shell.Close()
// nice welcome message.
fmt.Fprintln(shell.Terminal)
if args := p.Args(); args != "" {
fmt.Fprintf(shell.Terminal, "Core %q was generated by %q\n", cfg.corefile, args)
}
fmt.Fprintf(shell.Terminal, "Entering interactive mode (type 'help' for commands)\n")
for {
l, err := shell.Readline()
if err != nil {
if err != io.EOF {
fmt.Printf("Error: %v\n", err)
}
break
}
err = capturePanic(func() {
ResetSubCommandFlagValues(root)
root.SetArgs(strings.Fields(l))
root.Execute()
})
if err != nil {
fmt.Printf("Error while trying to run command %q: %v", l, err)
}
}
}