wormhole-explorer/analytics/parser/vaa_csv.go

87 lines
1.5 KiB
Go

package parser
import (
"bufio"
"context"
"encoding/hex"
"fmt"
"io"
"log"
"os"
"strings"
sdk "github.com/wormhole-foundation/wormhole/sdk/vaa"
)
type vaaProcessor func(vaa *sdk.VAA) error
type VaaCsvParser struct {
processor vaaProcessor
filename string
}
func NewVaaCsvParser(processor vaaProcessor, filename string) *VaaCsvParser {
return &VaaCsvParser{
processor: processor,
filename: filename,
}
}
func (p *VaaCsvParser) Start(_ context.Context) {
c := 0
i := 0
f, err := os.Open(p.filename)
if err != nil {
panic(err)
}
defer f.Close()
r := bufio.NewReader(f)
// read file line by line and send to workpool
for lineNumber := uint(0); ; lineNumber++ {
line, _, err := r.ReadLine() //loading chunk into buffer
if err != nil {
if err == io.EOF {
break
}
log.Fatalf("a real error happened in line [%d]. %v\n", lineNumber, err)
}
err = p.processLine(line)
if err != nil {
fmt.Fprintf(os.Stderr, "processing line number [%d] failed: %v\n", lineNumber, err)
} else {
if c == 10000 {
fmt.Printf(".")
c = 0
i := i + 1
if i == 10 {
fmt.Printf("\n")
i = 0
}
}
}
}
}
func (p *VaaCsvParser) processLine(line []byte) error {
tt := strings.Split(string(line), ",")
if len(tt) != 2 {
return fmt.Errorf("invalid line: %s", line)
}
data, err := hex.DecodeString(tt[1])
if err != nil {
return fmt.Errorf("error decoding: %v", err)
}
vaa, err := sdk.Unmarshal(data)
if err != nil {
return fmt.Errorf("error unmarshaling vaa: %v", err)
}
return p.processor(vaa)
}