github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/execution/exec/events.go (about)

     1  package exec
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/hyperledger/burrow/event/query"
     8  	"github.com/hyperledger/burrow/execution/errors"
     9  )
    10  
    11  type Events []*Event
    12  
    13  func (evs *Events) Append(tail ...*Event) {
    14  	for i, ev := range tail {
    15  		if ev != nil && ev.Header != nil {
    16  			ev.Header.Index = uint64(len(*evs) + i)
    17  		}
    18  	}
    19  	*evs = append(*evs, tail...)
    20  }
    21  
    22  func (evs *Events) Call(call *CallEvent, exception *errors.Exception) error {
    23  	evs.Append(&Event{
    24  		Header: &Header{
    25  			EventType: TypeCall,
    26  			EventID:   EventStringAccountCall(call.CallData.Callee),
    27  			Exception: exception,
    28  		},
    29  		Call: call,
    30  	})
    31  	return nil
    32  }
    33  
    34  func (evs *Events) Log(log *LogEvent) error {
    35  	evs.Append(&Event{
    36  		Header: &Header{
    37  			EventType: TypeLog,
    38  			EventID:   EventStringLogEvent(log.Address),
    39  		},
    40  		Log: log,
    41  	})
    42  	return nil
    43  }
    44  
    45  func (evs *Events) Print(print *PrintEvent) error {
    46  	evs.Append(&Event{
    47  		Header: &Header{
    48  			EventType: TypePrint,
    49  			EventID:   EventStringLogEvent(print.Address),
    50  		},
    51  		Print: print,
    52  	})
    53  	return nil
    54  }
    55  
    56  func (evs Events) CallTrace() string {
    57  	var calls []string
    58  	for _, ev := range evs {
    59  		if ev.Call != nil {
    60  			ex := ""
    61  			if ev.Header.Exception != nil {
    62  				ex = fmt.Sprintf(" [%v]", ev.Header.Exception)
    63  			}
    64  			calls = append(calls, fmt.Sprintf("%v: %v -> %v: %v%s",
    65  				ev.Call.CallType, ev.Call.CallData.Caller, ev.Call.CallData.Callee, ev.Call.Return, ex))
    66  		}
    67  	}
    68  	return strings.Join(calls, "\n")
    69  }
    70  
    71  func (evs Events) ExceptionalCalls() []*Event {
    72  	var exCalls []*Event
    73  	for _, ev := range evs {
    74  		if ev.Call != nil && ev.Header.Exception != nil {
    75  			exCalls = append(exCalls, ev)
    76  		}
    77  	}
    78  	return exCalls
    79  }
    80  
    81  func (evs Events) NestedCallErrors() []errors.NestedCallError {
    82  	var nestedErrors []errors.NestedCallError
    83  	for _, ev := range evs {
    84  		if ev.Call != nil && ev.Header.Exception != nil {
    85  			nestedErrors = append(nestedErrors, errors.NestedCallError{
    86  				CodedError: ev.Header.Exception,
    87  				Caller:     ev.Call.CallData.Caller,
    88  				Callee:     ev.Call.CallData.Callee,
    89  				StackDepth: ev.Call.StackDepth,
    90  			})
    91  		}
    92  	}
    93  	return nestedErrors
    94  }
    95  
    96  func (evs Events) Filter(qry query.Query) Events {
    97  	var filtered Events
    98  	for _, tev := range evs {
    99  		if qry.Matches(tev) {
   100  			filtered = append(filtered, tev)
   101  		}
   102  	}
   103  	return filtered
   104  }