go-nostr/event_simdjson.go

85 lines
1.7 KiB
Go

package nostr
import (
"fmt"
"slices"
"github.com/minio/simdjson-go"
)
var (
attrId = []byte("id")
attrPubkey = []byte("pubkey")
attrCreatedAt = []byte("created_at")
attrKind = []byte("kind")
attrContent = []byte("content")
attrTags = []byte("tags")
attrSig = []byte("sig")
)
func (event *Event) UnmarshalSIMD(iter *simdjson.Iter) error {
obj, err := iter.Object(nil)
if err != nil {
return fmt.Errorf("unexpected at event: %w", err)
}
for {
name, t, err := obj.NextElementBytes(iter)
if err != nil {
return err
} else if t == simdjson.TypeNone {
break
}
switch {
case slices.Equal(name, attrId):
event.ID, err = iter.String()
case slices.Equal(name, attrPubkey):
event.PubKey, err = iter.String()
case slices.Equal(name, attrContent):
event.Content, err = iter.String()
case slices.Equal(name, attrSig):
event.Sig, err = iter.String()
case slices.Equal(name, attrCreatedAt):
var ts uint64
ts, err = iter.Uint()
event.CreatedAt = Timestamp(ts)
case slices.Equal(name, attrKind):
var kind uint64
kind, err = iter.Uint()
event.Kind = int(kind)
case slices.Equal(name, attrTags):
var arr *simdjson.Array
arr, err = iter.Array(nil)
if err != nil {
return err
}
event.Tags = make(Tags, 0, 10)
titer := arr.Iter()
var subArr *simdjson.Array
for {
if t := titer.Advance(); t == simdjson.TypeNone {
break
}
subArr, err = titer.Array(subArr)
if err != nil {
return err
}
tag, err := subArr.AsString()
if err != nil {
return err
}
event.Tags = append(event.Tags, tag)
}
default:
return fmt.Errorf("unexpected event field '%s'", name)
}
if err != nil {
return err
}
}
return nil
}