48 lines
1.7 KiB
Go
48 lines
1.7 KiB
Go
package cmd
|
||
|
||
import (
|
||
"flag"
|
||
"strings"
|
||
|
||
reg "reg/internal/reg"
|
||
)
|
||
|
||
// parseFlags парсит флаги команды.
|
||
//
|
||
// Встроенная обработка флагов -h/-help/--help отключена: при попытке их
|
||
// использовать возвращается сообщение "нет такой опции: <flag>". Справка
|
||
// доступна через команду `reg help <command>`.
|
||
//
|
||
// Возвращает (code, ok): при ok=true флаги успешно разобраны,
|
||
// code игнорируется; при ok=false команда должна немедленно
|
||
// вернуть code.
|
||
func parseFlags(fs *flag.FlagSet, args []string) (int, bool) {
|
||
if err := fs.Parse(args); err != nil {
|
||
if err == flag.ErrHelp {
|
||
reg.PrintError(MsgNoSuchOption.F(FindHelpFlag(args)))
|
||
return 1, false
|
||
}
|
||
reg.PrintError(err.Error())
|
||
return 1, false
|
||
}
|
||
return 0, true
|
||
}
|
||
|
||
// FindHelpFlag возвращает первый флаг из args, который flag-пакет
|
||
// распознаёт как флаг справки (-h, -help, --help и формы с '=').
|
||
// Если ничего не найдено — возвращает "-h".
|
||
func FindHelpFlag(args []string) string {
|
||
for _, a := range args {
|
||
switch {
|
||
case a == "-h", a == "-help", a == "--help":
|
||
return a
|
||
case strings.HasPrefix(a, "-h="), strings.HasPrefix(a, "-help="), strings.HasPrefix(a, "--help="):
|
||
if i := strings.IndexByte(a, '='); i >= 0 {
|
||
return a[:i]
|
||
}
|
||
return a
|
||
}
|
||
}
|
||
return "-h"
|
||
}
|