oss/lib/help.go (150 lines of code) (raw):
package lib
import (
"fmt"
"reflect"
"strings"
)
// global public variable for formating help text
const (
FormatTAB = " "
MaxCommandNameLen = 18
UsageTextChinese = "用法: ossutil [command] [args...] [options...]\n请使用ossutil help command来显示command命令的帮助"
UsageTextEnglish = "Usage: ossutil [command] [args...] [options...]\nPlease use 'ossutil help command' to show help of command"
)
var specChineseHelp = SpecText{
synopsisText: "获取命令的帮助文档",
paramText: "[command]",
syntaxText: `
ossutil help [command]
`,
detailHelpText: `
该命令提供ossutil所有命令的帮助文档,或者针对用户输入的某具体命令提供它的帮助文档。
用法:
该命令有两种用法:
1) ossutil help
该用法提供ossutil支持的所有命令的简介,对每个命令显示该命令的摘要和语法简介。
2) ossutil help command
该用法提供指定命令(command)的帮助文档,包括该命令的详细介绍、示例、可选参数。
`,
sampleText: `
ossutil help
ossutil help help
ossutil help ls
`,
}
var specEnglishHelp = SpecText{
synopsisText: "Get help about commands",
paramText: "[command]",
syntaxText: `
ossutil help [command]
`,
detailHelpText: `
The command provide the usage of all commands on which help is available,
or the usage of the specified command.
Usage:
There are two usages:
1) ossutil help
The usage provides a summary of all commands, each command shows the
synopsis and a simplified expression of the syntax.
2) ossutil help command
The usage provides help about the specified command, which contains
a detailed description of the command, include samples and optional options.
`,
sampleText: `
ossutil help
ossutil help help
ossutil help ls
`,
}
// HelpCommand is the command format help text
type HelpCommand struct {
command Command
}
var helpCommand = HelpCommand{
command: Command{
name: "help",
nameAlias: []string{},
minArgc: 0,
maxArgc: 1,
specChinese: specChineseHelp,
specEnglish: specEnglishHelp,
group: GroupTypeAdditionalCommand,
validOptionNames: []string{
OptionLanguage,
OptionLogLevel,
},
},
}
// function for RewriteLoadConfiger interface
func (hc *HelpCommand) rewriteLoadConfig(configFile string) error {
// read config file, if error exist, do not print error
var err error
if hc.command.configOptions, err = LoadConfig(configFile); err != nil {
hc.command.configOptions = OptionMapType{}
}
return nil
}
// function for FormatHelper interface
func (hc *HelpCommand) formatHelpForWhole() string {
return hc.command.formatHelpForWhole()
}
func (hc *HelpCommand) formatIndependHelp() string {
return hc.command.formatIndependHelp()
}
// Init simulate inheritance, and polymorphism
func (hc *HelpCommand) Init(args []string, options OptionMapType) error {
return hc.command.Init(args, options, hc)
}
// RunCommand simulate inheritance, and polymorphism
func (hc *HelpCommand) RunCommand() error {
groupCommandMap, subCommandMap := hc.getCommandMap()
if len(hc.command.args) == 0 {
// ossutil help
text := hc.formatWholeHelp(groupCommandMap)
Output(text)
} else {
//ossutil help command
if text, err := hc.formatCommandHelp(subCommandMap); err == nil {
Output(text)
} else {
return err
}
}
return nil
}
func (hc *HelpCommand) getCommandMap() (map[string][]interface{}, map[string]interface{}) {
commandList := GetAllCommands()
groupCommandMap := map[string][]interface{}{}
subCommandMap := map[string]interface{}{}
for _, cmd := range commandList {
group := reflect.ValueOf(cmd).Elem().FieldByName("command").FieldByName("group").String()
groupCommandMap[group] = append(groupCommandMap[group], cmd)
name := reflect.ValueOf(cmd).Elem().FieldByName("command").FieldByName("name").String()
subCommandMap[name] = cmd
}
return groupCommandMap, subCommandMap
}
func (hc *HelpCommand) formatWholeHelp(groupCommandMap map[string][]interface{}) string {
if len(groupCommandMap) == 0 {
return ""
}
commandsText := ""
for _, group := range CommandGroups {
commandList := groupCommandMap[group]
if len(commandList) == 0 {
continue
}
commandsText += group
for _, cmd := range commandList {
commandsText += cmd.(FormatHelper).formatHelpForWhole()
}
}
return fmt.Sprintf("%s\n%s", hc.getUsageText(), commandsText)
}
func (hc *HelpCommand) getUsageText() string {
val, _ := GetString(OptionLanguage, helpCommand.command.options)
switch strings.ToLower(val) {
case LEnglishLanguage:
return UsageTextEnglish
default:
return UsageTextChinese
}
}
func (hc *HelpCommand) formatCommandHelp(subCommandMap map[string]interface{}) (string, error) {
subCommandName := hc.command.args[0]
if cmd, ok := subCommandMap[subCommandName]; ok {
return cmd.(FormatHelper).formatIndependHelp(), nil
}
return "", fmt.Errorf("no such command: \"%s\", please try \"help\" for more information", subCommandName)
}