提交 4970d8b5 作者: Matt Bell 提交者: Juan Batiz-Benet

commands/cli: Use template for helptext generation

上级 ea15bd6f
...@@ -107,11 +107,9 @@ func createRequest(args []string) (cmds.Request, *cmds.Command, error) { ...@@ -107,11 +107,9 @@ func createRequest(args []string) (cmds.Request, *cmds.Command, error) {
} }
// generate the help text for the command the user was trying to call (or root) // generate the help text for the command the user was trying to call (or root)
helpText, htErr := cmdsCli.HelpText("ipfs", root, path) htErr := cmdsCli.LongHelp("ipfs", root, path, os.Stdout)
if htErr != nil { if htErr != nil {
fmt.Println(htErr) fmt.Println(htErr)
} else {
fmt.Println(helpText)
} }
return nil, nil, err return nil, nil, err
} }
...@@ -150,12 +148,10 @@ func handleHelpOption(req cmds.Request, root *cmds.Command) (helpTextDisplayed b ...@@ -150,12 +148,10 @@ func handleHelpOption(req cmds.Request, root *cmds.Command) (helpTextDisplayed b
if !help { if !help {
return false, nil return false, nil
} }
helpText, err := cmdsCli.HelpText("ipfs", root, req.Path()) err = cmdsCli.LongHelp("ipfs", root, req.Path(), os.Stdout)
if err != nil { if err != nil {
return false, err return false, err
} }
fmt.Println(helpText)
return true, nil return true, nil
} }
...@@ -214,11 +210,9 @@ func outputResponse(res cmds.Response, root *cmds.Command) error { ...@@ -214,11 +210,9 @@ func outputResponse(res cmds.Response, root *cmds.Command) error {
// if this is a client error, we try to display help text // if this is a client error, we try to display help text
if res.Error().Code == cmds.ErrClient { if res.Error().Code == cmds.ErrClient {
helpText, err := cmdsCli.HelpText("ipfs", root, res.Request().Path()) err := cmdsCli.LongHelp("ipfs", root, res.Request().Path(), os.Stdout)
if err != nil { if err != nil {
fmt.Println(err.Error()) fmt.Println(err)
} else {
fmt.Println(helpText)
} }
} }
......
...@@ -2,7 +2,9 @@ package cli ...@@ -2,7 +2,9 @@ package cli
import ( import (
"fmt" "fmt"
"io"
"strings" "strings"
"text/template"
cmds "github.com/jbenet/go-ipfs/commands" cmds "github.com/jbenet/go-ipfs/commands"
) )
...@@ -15,60 +17,104 @@ const ( ...@@ -15,60 +17,104 @@ const (
optionType = "(%v)" optionType = "(%v)"
whitespace = "\r\n\t " whitespace = "\r\n\t "
indentStr = " "
) )
// HelpText returns a formatted CLI helptext string, generated for the given command type helpFields struct {
func HelpText(rootName string, root *cmds.Command, path []string) (string, error) { Indent string
cmd, err := root.Get(path) Path string
ArgUsage string
Tagline string
Arguments string
Options string
Subcommands string
Description string
}
const usageFormat = "{{.Path}}{{if .ArgUsage}} {{.ArgUsage}}{{end}} - {{.Tagline}}"
const longHelpFormat = `
{{.Indent}}{{template "usage" .}}
{{if .Arguments}}ARGUMENTS:
{{.Indent}}{{.Arguments}}
{{end}}{{if .Options}}OPTIONS:
{{.Indent}}{{.Options}}
{{end}}{{if .Subcommands}}SUBCOMMANDS:
{{.Indent}}{{.Subcommands}}
{{.Indent}}Use '{{.Path}} <subcmd> --help' for more information about each command.
{{end}}{{if .Description}}DESCRIPTION:
{{.Indent}}{{.Description}}
{{end}}
`
var longHelpTemplate *template.Template
var usageTemplate *template.Template
func init() {
tmpl, err := template.New("usage").Parse(usageFormat)
if err != nil { if err != nil {
return "", err panic(err)
} }
usageTemplate = tmpl
s := "" tmpl, err = usageTemplate.New("longHelp").Parse(longHelpFormat)
usage := usageText(cmd) if err != nil {
if len(usage) > 0 { panic(err)
usage += " "
} }
s += fmt.Sprintf("%v %v %v- %v\n\n", rootName, strings.Join(path, " "), usage, cmd.Description) longHelpTemplate = tmpl
}
if len(cmd.Help) > 0 { // LongHelp returns a formatted CLI helptext string, generated for the given command
s += fmt.Sprintf("%v\n\n", strings.Trim(cmd.Help, whitespace)) func LongHelp(rootName string, root *cmds.Command, path []string, out io.Writer) error {
cmd, err := root.Get(path)
if err != nil {
return err
} }
if cmd.Arguments != nil { pathStr := rootName
if len(cmd.ArgumentHelp) > 0 { if len(path) > 0 {
s += cmd.ArgumentHelp pathStr += " " + strings.Join(path, " ")
} else {
section := strings.Join(indent(argumentText(cmd), " "), "\n")
s += fmt.Sprintf("Arguments:\n%v", section)
}
s += "\n\n"
} }
if cmd.Subcommands != nil { fields := helpFields{
if len(cmd.SubcommandHelp) > 0 { Indent: indentStr,
s += cmd.SubcommandHelp Path: pathStr,
} else { ArgUsage: usageText(cmd),
section := strings.Join(indent(subcommandText(cmd, rootName, path), " "), "\n") Tagline: cmd.Description,
s += fmt.Sprintf("Subcommands:\n%v", section) Arguments: cmd.ArgumentHelp,
} Options: cmd.OptionHelp,
Subcommands: cmd.SubcommandHelp,
s += "\n\n" Description: cmd.Help,
} }
if cmd.Options != nil { // autogen fields that are empty
if len(cmd.OptionHelp) > 0 { if len(cmd.ArgumentHelp) == 0 {
s += cmd.OptionHelp fields.Arguments = strings.Join(argumentText(cmd), "\n")
} else { }
section := strings.Join(indent(optionText(cmd), " "), "\n") if len(cmd.OptionHelp) == 0 {
s += fmt.Sprintf("Options:\n%v", section) fields.Options = strings.Join(optionText(cmd), "\n")
}
s += "\n\n"
} }
if len(cmd.SubcommandHelp) == 0 {
fields.Subcommands = strings.Join(subcommandText(cmd, rootName, path), "\n")
}
fields.Arguments = indentString(fields.Arguments, indentStr)
fields.Options = indentString(fields.Options, indentStr)
fields.Subcommands = indentString(fields.Subcommands, indentStr)
fields.Description = indentString(fields.Description, indentStr)
return s, nil return longHelpTemplate.Execute(out, fields)
} }
func argumentText(cmd *cmds.Command) []string { func argumentText(cmd *cmds.Command) []string {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论