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  }