121 lines
2.9 KiB
Go
121 lines
2.9 KiB
Go
package command
|
|
|
|
import (
|
|
"context"
|
|
"math"
|
|
"os"
|
|
|
|
"gitoa.ru/go-4devs/config"
|
|
"gitoa.ru/go-4devs/config/definition/option"
|
|
"gitoa.ru/go-4devs/config/value"
|
|
"gitoa.ru/go-4devs/console/output"
|
|
"gitoa.ru/go-4devs/console/output/verbosity"
|
|
)
|
|
|
|
const (
|
|
OptionHelp = "help"
|
|
OptionVersion = "version"
|
|
OptionAnsi = "ansi"
|
|
OptionNoAnsi = "no-ansi"
|
|
OptionQuiet = "quiet"
|
|
OptionVerbose = "verbose"
|
|
)
|
|
|
|
const (
|
|
verboseTrace = 3
|
|
verboseDebug = 2
|
|
verboseInfo = 1
|
|
)
|
|
|
|
const (
|
|
defaultOptionsPosition = math.MaxUint64 / 2
|
|
)
|
|
|
|
// Default options and argument command.
|
|
func Default(def config.Definition) {
|
|
def.Add(
|
|
option.Bool(OptionNoAnsi, "Disable ANSI output", option.Position(defaultOptionsPosition)),
|
|
option.Bool(OptionAnsi, "Do not ask any interactive question", option.Position(defaultOptionsPosition)),
|
|
option.Bool(OptionVersion, "Display this application version", option.Short('V'), option.Position(defaultOptionsPosition)),
|
|
option.Bool(OptionHelp, "Display this help message", option.Short('h'), option.Position(defaultOptionsPosition)),
|
|
option.Bool(OptionVerbose,
|
|
"Increase the verbosity of messages: -v for info output, -vv for debug and -vvv for trace",
|
|
option.Short('v'), option.Slice, option.Position(defaultOptionsPosition)),
|
|
option.Bool(OptionQuiet, "Do not output any message", option.Short('q'), option.Position(defaultOptionsPosition)),
|
|
)
|
|
}
|
|
|
|
func IsShowVersion(ctx context.Context, in config.Provider) bool {
|
|
v, err := in.Value(ctx, OptionVersion)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
|
|
return v.Bool()
|
|
}
|
|
|
|
func IsShowHelp(ctx context.Context, in config.Provider) bool {
|
|
v, err := in.Value(ctx, OptionHelp)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
|
|
return v.Bool()
|
|
}
|
|
|
|
func Ansi(ctx context.Context, in config.Provider, out output.Output) output.Output {
|
|
switch {
|
|
case ReadValue(ctx, in, OptionAnsi).Bool():
|
|
out = output.Ansi(out)
|
|
case ReadValue(ctx, in, OptionNoAnsi).Bool():
|
|
out = output.None(out)
|
|
case lookupEnv("NO_COLOR"):
|
|
out = output.None(out)
|
|
default:
|
|
out = output.Ansi(out)
|
|
}
|
|
|
|
return out
|
|
}
|
|
|
|
func lookupEnv(name string) bool {
|
|
v, has := os.LookupEnv(name)
|
|
|
|
return has && v == "true"
|
|
}
|
|
|
|
func Verbose(ctx context.Context, in config.Provider, out output.Output) output.Output {
|
|
out = Ansi(ctx, in, out)
|
|
|
|
switch {
|
|
case ReadValue(ctx, in, OptionQuiet).Bool():
|
|
out = output.Quiet()
|
|
default:
|
|
var verb []bool
|
|
|
|
_ = ReadValue(ctx, in, OptionVerbose).Unmarshal(&verb)
|
|
|
|
switch {
|
|
case len(verb) == verboseInfo:
|
|
out = output.Verbosity(out, verbosity.Info)
|
|
case len(verb) == verboseDebug:
|
|
out = output.Verbosity(out, verbosity.Debug)
|
|
case len(verb) >= verboseTrace:
|
|
out = output.Verbosity(out, verbosity.Trace)
|
|
default:
|
|
out = output.Verbosity(out, verbosity.Norm)
|
|
}
|
|
}
|
|
|
|
return out
|
|
}
|
|
|
|
func ReadValue(ctx context.Context, in config.Provider, path ...string) config.Value {
|
|
val, err := in.Value(ctx, path...)
|
|
if err != nil {
|
|
return value.EmptyValue()
|
|
}
|
|
|
|
return val
|
|
}
|