package eventlog import ( "strings" abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/internal/eventlog/cursor" "github.com/tendermint/tendermint/types" ) // Cached constants for the pieces of reserved event names. var ( tmTypeTag string tmTypeKey string ) func init() { parts := strings.SplitN(types.EventTypeKey, ".", 2) if len(parts) != 2 { panic("invalid event type key: " + types.EventTypeKey) } tmTypeTag = parts[0] tmTypeKey = parts[1] } // ABCIEventer is an optional extension interface that may be implemented by // event data types, to expose ABCI metadata to the event log. If an event item // does not implement this interface, it is presumed to have no ABCI metadata. type ABCIEventer interface { // Return any ABCI events metadata the receiver contains. // The reported slice must not contain a type (tm.event) record, since some // events share the same structure among different event types. ABCIEvents() []abci.Event } // An Item is a single event item. type Item struct { Cursor cursor.Cursor Type string Data types.EventData Events []abci.Event } // newItem constructs a new item with the specified cursor, type, and data. func newItem(cursor cursor.Cursor, etype string, data types.EventData) *Item { return &Item{Cursor: cursor, Type: etype, Data: data, Events: makeEvents(etype, data)} } // makeEvents returns a slice of ABCI events comprising the type tag along with // any internal events exported by the data value. func makeEvents(etype string, data types.EventData) []abci.Event { base := []abci.Event{{ Type: tmTypeTag, Attributes: []abci.EventAttribute{{ Key: tmTypeKey, Value: etype, }}, }} if evt, ok := data.(ABCIEventer); ok { return append(base, evt.ABCIEvents()...) } return base } // FindType reports whether events contains a tm.event event, and if so returns // its value, which is the type of the underlying event item. func FindType(events []abci.Event) (string, bool) { for _, evt := range events { if evt.Type != tmTypeTag { continue } for _, attr := range evt.Attributes { if attr.Key == tmTypeKey { return attr.Value, true } } } return "", false }