87 lines
1.5 KiB
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)
|
|
}
|