github.com/diadata-org/diadata@v1.4.593/pkg/dia/helpers/substrate-helper/gsrpc/registry/parser/event_parser.go (about) 1 package parser 2 3 import ( 4 "bytes" 5 "fmt" 6 7 "github.com/diadata-org/diadata/pkg/dia/helpers/substrate-helper/gsrpc/registry" 8 "github.com/diadata-org/diadata/pkg/dia/helpers/substrate-helper/gsrpc/scale" 9 "github.com/diadata-org/diadata/pkg/dia/helpers/substrate-helper/gsrpc/types" 10 ) 11 12 // Event holds all the information of a decoded storage event. 13 type Event struct { 14 Name string 15 Fields registry.DecodedFields 16 EventID types.EventID 17 Phase *types.Phase 18 Topics []types.Hash 19 } 20 21 //go:generate mockery --name EventParser --structname EventParserMock --filename event_parser_mock.go --inpackage 22 23 // EventParser is the interface used for parsing event storage data into []*Event. 24 type EventParser interface { 25 ParseEvents(eventRegistry registry.EventRegistry, sd *types.StorageDataRaw) ([]*Event, error) 26 } 27 28 // EventParserFn implements EventParser. 29 type EventParserFn func(eventRegistry registry.EventRegistry, sd *types.StorageDataRaw) ([]*Event, error) 30 31 // ParseEvents is the function required for satisfying the EventParser interface. 32 func (f EventParserFn) ParseEvents(eventRegistry registry.EventRegistry, sd *types.StorageDataRaw) ([]*Event, error) { 33 return f(eventRegistry, sd) 34 } 35 36 // NewEventParser creates a new EventParser. 37 func NewEventParser() EventParser { 38 // The EventParserFn provided here is decoding the total number of events from the storage data then attempts 39 // to decode all the information for each event. 40 return EventParserFn(func(eventRegistry registry.EventRegistry, sd *types.StorageDataRaw) ([]*Event, error) { 41 decoder := scale.NewDecoder(bytes.NewReader(*sd)) 42 43 eventsCount, err := decoder.DecodeUintCompact() 44 45 if err != nil { 46 return nil, ErrEventsCountDecoding.Wrap(err) 47 } 48 49 var events []*Event 50 51 for i := uint64(0); i < eventsCount.Uint64(); i++ { 52 var phase types.Phase 53 54 if err := decoder.Decode(&phase); err != nil { 55 return nil, ErrEventPhaseDecoding.Wrap(fmt.Errorf("event #%d: %w", i, err)) 56 } 57 58 var eventID types.EventID 59 60 if err := decoder.Decode(&eventID); err != nil { 61 return nil, ErrEventIDDecoding.Wrap(fmt.Errorf("event #%d: %w", i, err)) 62 } 63 64 eventDecoder, ok := eventRegistry[eventID] 65 66 if !ok { 67 return nil, ErrEventDecoderNotFound.WithMsg("event #%d with ID: %v", i, eventID) 68 } 69 70 eventFields, err := eventDecoder.Decode(decoder) 71 72 if err != nil { 73 return nil, ErrEventFieldsDecoding.Wrap(fmt.Errorf("event #%d: %w", i, err)) 74 } 75 76 var topics []types.Hash 77 78 if err := decoder.Decode(&topics); err != nil { 79 return nil, ErrEventTopicsDecoding.Wrap(fmt.Errorf("event #%d: %w", i, err)) 80 } 81 82 event := &Event{ 83 Name: eventDecoder.Name, 84 Fields: eventFields, 85 EventID: eventID, 86 Phase: &phase, 87 Topics: topics, 88 } 89 90 events = append(events, event) 91 } 92 93 return events, nil 94 }) 95 }