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  }