package event import ( "bytes" "io" "smesh.lol/pkg/nostr/ec/schnorr" "smesh.lol/pkg/nostr/tag" "smesh.lol/pkg/nostr/varint" "smesh.lol/pkg/lol/chk" ) func (ev *E) MarshalBinary(w io.Writer) { _, _ = w.Write(ev.ID) _, _ = w.Write(ev.Pubkey) varint.Encode(w, uint64(ev.CreatedAt)) varint.Encode(w, uint64(ev.Kind)) if ev.Tags == nil { varint.Encode(w, 0) } else { varint.Encode(w, uint64(ev.Tags.Len())) for _, x := range *ev.Tags { varint.Encode(w, uint64(x.Len())) for _, y := range x.T { varint.Encode(w, uint64(len(y))) _, _ = w.Write(y) } } } varint.Encode(w, uint64(len(ev.Content))) _, _ = w.Write(ev.Content) _, _ = w.Write(ev.Sig) } func (ev *E) MarshalBinaryToBytes(dst []byte) []byte { var buf *bytes.Buffer if dst == nil { size := 32 + 32 + 10 + 10 + 64 if ev.Tags != nil { for _, t := range *ev.Tags { size += 10 for _, elem := range t.T { size += 10 + len(elem) } } } size += 10 + len(ev.Content) b := []byte{:0:size} buf = bytes.NewBuffer(b) } else { buf = bytes.NewBuffer(dst[:0]) } ev.MarshalBinary(buf) return buf.Bytes() } func (ev *E) UnmarshalBinary(r io.Reader) (err error) { ev.ID = []byte{:32} if _, err = r.Read(ev.ID); chk.E(err) { return } ev.Pubkey = []byte{:32} if _, err = r.Read(ev.Pubkey); chk.E(err) { return } var ca uint64 if ca, err = varint.Decode(r); chk.E(err) { return } ev.CreatedAt = int64(ca) var k uint64 if k, err = varint.Decode(r); chk.E(err) { return } ev.Kind = uint16(k) var nTags uint64 if nTags, err = varint.Decode(r); chk.E(err) { return } if nTags == 0 { ev.Tags = nil } else { ev.Tags = tag.NewSWithCap(int(nTags)) for range nTags { var nField uint64 if nField, err = varint.Decode(r); chk.E(err) { return } t := tag.NewWithCap(int(nField)) for range nField { var lenField uint64 if lenField, err = varint.Decode(r); chk.E(err) { return } field := []byte{:lenField} if _, err = r.Read(field); chk.E(err) { return } t.T = append(t.T, field) } *ev.Tags = append(*ev.Tags, t) } } var cLen uint64 if cLen, err = varint.Decode(r); chk.E(err) { return } ev.Content = []byte{:cLen} if _, err = r.Read(ev.Content); chk.E(err) { return } ev.Sig = []byte{:schnorr.SignatureSize} if _, err = r.Read(ev.Sig); chk.E(err) { return } return }