github.com/diamondburned/arikawa/v2@v2.1.0/bot/error.go (about)

     1  package bot
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"strings"
     7  )
     8  
     9  type ErrUnknownCommand struct {
    10  	Parts  []string // max len 2
    11  	Subcmd *Subcommand
    12  }
    13  
    14  func newErrUnknownCommand(s *Subcommand, parts []string) error {
    15  	if len(parts) > 2 {
    16  		parts = parts[:2]
    17  	}
    18  
    19  	return &ErrUnknownCommand{
    20  		Parts:  parts,
    21  		Subcmd: s,
    22  	}
    23  }
    24  
    25  func (err *ErrUnknownCommand) Error() string {
    26  	return UnknownCommandString(err)
    27  }
    28  
    29  var UnknownCommandString = func(err *ErrUnknownCommand) string {
    30  	// Subcommand check.
    31  	if err.Subcmd.StructName == "" || len(err.Parts) < 2 {
    32  		return "unknown command: " + err.Parts[0] + "."
    33  	}
    34  
    35  	return fmt.Sprintf("unknown %s subcommand: %s.", err.Parts[0], err.Parts[1])
    36  }
    37  
    38  var (
    39  	ErrTooManyArgs   = errors.New("too many arguments given")
    40  	ErrNotEnoughArgs = errors.New("not enough arguments given")
    41  )
    42  
    43  type ErrInvalidUsage struct {
    44  	Prefix string
    45  	Args   []string
    46  	Index  int
    47  	Wrap   error
    48  
    49  	// TODO: usage generator?
    50  	// Here, as a reminder
    51  	Ctx *MethodContext
    52  }
    53  
    54  func (err *ErrInvalidUsage) Error() string {
    55  	return InvalidUsageString(err)
    56  }
    57  
    58  func (err *ErrInvalidUsage) Unwrap() error {
    59  	return err.Wrap
    60  }
    61  
    62  var InvalidUsageString = func(err *ErrInvalidUsage) string {
    63  	if err.Index == 0 && err.Wrap != nil {
    64  		return "invalid usage, error: " + err.Wrap.Error() + "."
    65  	}
    66  
    67  	if err.Index == 0 || len(err.Args) == 0 {
    68  		return "missing arguments. Refer to help."
    69  	}
    70  
    71  	body := "Invalid usage at " +
    72  		// Write the prefix.
    73  		err.Prefix +
    74  		// Write the first part
    75  		strings.Join(err.Args[:err.Index], " ") +
    76  		// Write the wrong part
    77  		" __" + err.Args[err.Index] + "__ " +
    78  		// Write the last part
    79  		strings.Join(err.Args[err.Index+1:], " ")
    80  
    81  	if err.Wrap != nil {
    82  		body += "\nError: " + err.Wrap.Error() + "."
    83  	}
    84  
    85  	return body
    86  }