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  }