sq/cli/flags.go
Neil O'Toole 2f2dfd6e47
#229: More diff (#233)
- Implement `sq diff --data`.
2023-05-22 09:08:14 -06:00

77 lines
1.8 KiB
Go

package cli
import (
"io"
"github.com/neilotoole/sq/libsq/core/errz"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
)
// cmdFlagChanged returns true if cmd is non-nil and
// has the named flag and that flag been changed.
func cmdFlagChanged(cmd *cobra.Command, name string) bool {
if cmd == nil {
return false
}
f := cmd.Flag(name)
if f == nil {
return false
}
return f.Changed
}
// cmdFlagIsSetTrue returns true if flag name has been changed
// and the flag value is true.
// Contrast with cmdFlagIsSetTrue.
func cmdFlagIsSetTrue(cmd *cobra.Command, name string) bool {
if !cmdFlagChanged(cmd, name) {
return false
}
b, err := cmd.Flags().GetBool(name)
if err != nil {
panic(err) // Should never happen
}
return b
}
// cmdFlagIsSetTrue returns the bool value of flag name. If the flag
// has not been set, its default value is returned.
// Contrast with cmdFlagIsSetTrue.
func cmdFlagBool(cmd *cobra.Command, name string) bool { //nolint:unused
b, err := cmd.Flags().GetBool(name)
if err != nil {
panic(err) // Should never happen
}
return b
}
// getBootstrapFlagValue parses osArgs looking for flg. The flag is always
// treated as string. This function exists because some components such
// as logging and config interrogate flags before cobra has loaded.
func getBootstrapFlagValue(flg, flgShort, flgUsage string, osArgs []string) (val string, ok bool, err error) {
fs := pflag.NewFlagSet("bootstrap", pflag.ContinueOnError)
fs.ParseErrorsWhitelist.UnknownFlags = true
fs.SetOutput(io.Discard)
_ = fs.StringP(flg, flgShort, "", flgUsage)
if err = fs.Parse(osArgs); err != nil {
return "", false, errz.Err(err)
}
if !fs.Changed(flg) {
return "", false, nil
}
if val, err = fs.GetString(flg); err != nil {
return "", false, errz.Err(err)
}
return val, true, nil
}