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 }