github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/execution/errors/maybe.go (about) 1 package errors 2 3 import ( 4 "math/big" 5 6 "github.com/hyperledger/burrow/crypto" 7 ) 8 9 type Maybe struct { 10 // Any error that may have occurred 11 error CodedError 12 } 13 14 func (m *Maybe) Error() error { 15 if m.error == nil { 16 return nil 17 } 18 return m.error 19 } 20 21 // Errors pushed to state may end up in TxExecutions and therefore the merkle state so it is essential that errors are 22 // deterministic and independent of the code path taken to execution (e.g. replay takes a different path to that of 23 // normal consensus reactor so stack traces may differ - as they may across architectures) 24 func (m *Maybe) PushError(err error) bool { 25 if err == nil { 26 return false 27 } 28 if m.error == nil { 29 // Make sure we are not wrapping a known nil value 30 ex := AsException(err) 31 if ex != nil { 32 m.error = ex 33 } 34 } 35 return true 36 } 37 38 func (m *Maybe) Uint64(value uint64, err error) uint64 { 39 if err != nil { 40 m.PushError(err) 41 } 42 return value 43 } 44 45 func (m *Maybe) Bool(value bool, err error) bool { 46 if err != nil { 47 m.PushError(err) 48 } 49 return value 50 } 51 52 func (m *Maybe) Bytes(value []byte, err error) []byte { 53 if err != nil { 54 m.PushError(err) 55 } 56 return value 57 } 58 59 func (m *Maybe) Address(value crypto.Address, err error) crypto.Address { 60 if err != nil { 61 m.PushError(err) 62 } 63 return value 64 } 65 66 func (m *Maybe) BigInt(value *big.Int, err error) *big.Int { 67 if err != nil { 68 m.PushError(err) 69 } 70 return value 71 } 72 73 func (m *Maybe) Void(err error) { 74 m.PushError(err) 75 }