github.com/ari-anchor/sei-tendermint@v0.0.0-20230519144642-dc826b7b56bb/internal/state/indexer/sink/sink.go (about)

     1  package sink
     2  
     3  import (
     4  	"errors"
     5  	"strings"
     6  
     7  	"github.com/ari-anchor/sei-tendermint/config"
     8  	"github.com/ari-anchor/sei-tendermint/internal/state/indexer"
     9  	"github.com/ari-anchor/sei-tendermint/internal/state/indexer/sink/kv"
    10  	"github.com/ari-anchor/sei-tendermint/internal/state/indexer/sink/null"
    11  	"github.com/ari-anchor/sei-tendermint/internal/state/indexer/sink/psql"
    12  )
    13  
    14  // EventSinksFromConfig constructs a slice of indexer.EventSink using the provided
    15  // configuration.
    16  func EventSinksFromConfig(cfg *config.Config, dbProvider config.DBProvider, chainID string) ([]indexer.EventSink, error) {
    17  	if len(cfg.TxIndex.Indexer) == 0 {
    18  		return []indexer.EventSink{null.NewEventSink()}, nil
    19  	}
    20  
    21  	// check for duplicated sinks
    22  	sinks := map[string]struct{}{}
    23  	for _, s := range cfg.TxIndex.Indexer {
    24  		sl := strings.ToLower(s)
    25  		if _, ok := sinks[sl]; ok {
    26  			return nil, errors.New("found duplicated sinks, please check the tx-index section in the config.toml")
    27  		}
    28  		sinks[sl] = struct{}{}
    29  	}
    30  	eventSinks := []indexer.EventSink{}
    31  	for k := range sinks {
    32  		switch indexer.EventSinkType(k) {
    33  		case indexer.NULL:
    34  			// When we see null in the config, the eventsinks will be reset with the
    35  			// nullEventSink.
    36  			return []indexer.EventSink{null.NewEventSink()}, nil
    37  
    38  		case indexer.KV:
    39  			store, err := dbProvider(&config.DBContext{ID: "tx_index", Config: cfg})
    40  			if err != nil {
    41  				return nil, err
    42  			}
    43  
    44  			eventSinks = append(eventSinks, kv.NewEventSink(store))
    45  
    46  		case indexer.PSQL:
    47  			conn := cfg.TxIndex.PsqlConn
    48  			if conn == "" {
    49  				return nil, errors.New("the psql connection settings cannot be empty")
    50  			}
    51  
    52  			es, err := psql.NewEventSink(conn, chainID)
    53  			if err != nil {
    54  				return nil, err
    55  			}
    56  			eventSinks = append(eventSinks, es)
    57  		default:
    58  			return nil, errors.New("unsupported event sink type")
    59  		}
    60  	}
    61  	return eventSinks, nil
    62  
    63  }