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 }