github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/execution/errors/codes.go (about) 1 package errors 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "reflect" 7 "strconv" 8 "strings" 9 ) 10 11 type codes struct { 12 None *Code 13 Generic *Code 14 UnknownAddress *Code 15 InsufficientBalance *Code 16 InvalidJumpDest *Code 17 InsufficientGas *Code 18 MemoryOutOfBounds *Code 19 CodeOutOfBounds *Code 20 InputOutOfBounds *Code 21 ReturnDataOutOfBounds *Code 22 CallStackOverflow *Code 23 CallStackUnderflow *Code 24 DataStackOverflow *Code 25 DataStackUnderflow *Code 26 InvalidContract *Code 27 NativeContractCodeCopy *Code 28 ExecutionAborted *Code 29 ExecutionReverted *Code 30 PermissionDenied *Code 31 NativeFunction *Code 32 EventPublish *Code 33 InvalidString *Code 34 EventMapping *Code 35 InvalidAddress *Code 36 DuplicateAddress *Code 37 InsufficientFunds *Code 38 Overpayment *Code 39 ZeroPayment *Code 40 InvalidSequence *Code 41 ReservedAddress *Code 42 IllegalWrite *Code 43 IntegerOverflow *Code 44 InvalidProposal *Code 45 ExpiredProposal *Code 46 ProposalExecuted *Code 47 NoInputPermission *Code 48 InvalidBlockNumber *Code 49 BlockNumberOutOfRange *Code 50 AlreadyVoted *Code 51 UnresolvedSymbols *Code 52 InvalidContractCode *Code 53 NonExistentAccount *Code 54 NotCallable *Code 55 56 // For lookup 57 codes []*Code 58 } 59 60 func (es *codes) init() error { 61 rv := reflect.ValueOf(es).Elem() 62 rt := rv.Type() 63 es.codes = make([]*Code, 0, rv.NumField()) 64 for i := 0; i < rv.NumField(); i++ { 65 ty := rt.Field(i) 66 // If field is exported 67 if ty.PkgPath == "" { 68 coding := rv.Field(i).Interface().(*Code) 69 if coding.Description == "" { 70 return fmt.Errorf("error code '%s' has no description", ty.Name) 71 } 72 coding.Number = uint32(i) 73 coding.Name = ty.Name 74 es.codes = append(es.codes, coding) 75 } 76 } 77 return nil 78 } 79 80 func (es *codes) JSON() string { 81 bs, err := json.MarshalIndent(es, "", "\t") 82 if err != nil { 83 panic(fmt.Errorf("could not create JSON errors object: %v", err)) 84 } 85 return string(bs) 86 } 87 88 func (es *codes) Get(number uint32) *Code { 89 if int(number) > len(es.codes)-1 { 90 return nil 91 } 92 return es.codes[number] 93 } 94 95 func (es *codes) String() string { 96 sb := new(strings.Builder) 97 for _, c := range es.codes { 98 sb.WriteString(strconv.FormatUint(uint64(c.Number), 10)) 99 sb.WriteString(": ") 100 sb.WriteString(c.Name) 101 sb.WriteString(" - ") 102 sb.WriteString(c.Description) 103 sb.WriteRune('\n') 104 } 105 return sb.String() 106 }