mirror of
https://github.com/luxfi/cli.git
synced 2026-10-30 17:01:20 +00:00
124 lines
2.8 KiB
Go
124 lines
2.8 KiB
Go
// Copyright (C) 2025, Lux Industries Inc. All rights reserved.
|
|
// See the file LICENSE for licensing terms.
|
|
package cobrautils
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/luxfi/cli/v2/pkg/utils"
|
|
"github.com/luxfi/cli/v2/pkg/ux"
|
|
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
type UsageError struct {
|
|
cmd *cobra.Command
|
|
err error
|
|
}
|
|
|
|
func (e UsageError) Error() string {
|
|
return fmt.Sprintf("Usage error: %s", e.err)
|
|
}
|
|
|
|
func ErrWrongArgCount(expected, got int) error {
|
|
return fmt.Errorf("requires %d arg(s), received %d args(s)", expected, got)
|
|
}
|
|
|
|
func ErrMaxArgCount(expected, got int) error {
|
|
return fmt.Errorf("max %d arg(s), received %d args(s)", expected, got)
|
|
}
|
|
|
|
func ErrMinArgCount(expected, got int) error {
|
|
return fmt.Errorf("min %d arg(s), received %d args(s)", expected, got)
|
|
}
|
|
|
|
func ErrRangeArgCount(expectedLow, expectedHigh, got int) error {
|
|
return fmt.Errorf("accepted number of arg(s) is %d to %d, received %d args(s)", expectedLow, expectedHigh, got)
|
|
}
|
|
|
|
func NewUsageError(cmd *cobra.Command, err error) UsageError {
|
|
return UsageError{
|
|
cmd: cmd,
|
|
err: err,
|
|
}
|
|
}
|
|
|
|
func ExactArgs(n int) cobra.PositionalArgs {
|
|
return func(cmd *cobra.Command, args []string) error {
|
|
if len(args) != n {
|
|
_ = cmd.Help() // show full help with flag grouping
|
|
fmt.Println("")
|
|
return utils.ErrWrongArgCount(n, len(args))
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func MaximumNArgs(n int) cobra.PositionalArgs {
|
|
return func(cmd *cobra.Command, args []string) error {
|
|
if len(args) > n {
|
|
_ = cmd.Help() // show full help with flag grouping
|
|
fmt.Println("")
|
|
return ErrMaxArgCount(n, len(args))
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func MinimumNArgs(n int) cobra.PositionalArgs {
|
|
return func(cmd *cobra.Command, args []string) error {
|
|
if len(args) < n {
|
|
_ = cmd.Help() // show full help with flag grouping
|
|
fmt.Println("")
|
|
return ErrMinArgCount(n, len(args))
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func RangeArgs(min int, max int) cobra.PositionalArgs {
|
|
return func(cmd *cobra.Command, args []string) error {
|
|
if len(args) < min || len(args) > max {
|
|
_ = cmd.Help() // show full help with flag grouping
|
|
fmt.Println("")
|
|
return ErrRangeArgCount(min, max, len(args))
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func HandleErrors(err error) {
|
|
if err != nil {
|
|
usageErr, ok := err.(UsageError)
|
|
if ok {
|
|
usageErr.cmd.Println(usageErr.cmd.UsageString())
|
|
usageErr.cmd.Println()
|
|
usageErr.cmd.Println(usageErr)
|
|
} else {
|
|
ux.Logger.PrintToUser("Error: %s", err)
|
|
}
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
func CommandSuiteUsage(cmd *cobra.Command, args []string) error {
|
|
if len(args) != 0 {
|
|
return NewUsageError(
|
|
cmd,
|
|
fmt.Errorf("invalid subcommand %q", strings.Join(args, " ")),
|
|
)
|
|
}
|
|
err := cmd.Help()
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func ConfigureRootCmd(cmd *cobra.Command) {
|
|
cmd.SetFlagErrorFunc(func(cmd *cobra.Command, err error) error {
|
|
return NewUsageError(cmd, err)
|
|
})
|
|
} |