req.mx raw
1 package envelope
2
3 import (
4 "io"
5
6 "smesh.lol/pkg/nostr/filter"
7 "smesh.lol/pkg/nostr/text"
8 "smesh.lol/pkg/lol/chk"
9 )
10
11 const ReqLabel = "REQ"
12
13 type Req struct {
14 Subscription []byte
15 Filters *filter.S
16 }
17
18 func (en *Req) Label() string { return ReqLabel }
19
20 func (en *Req) Write(w io.Writer) (err error) {
21 _, err = w.Write(en.Marshal(nil))
22 return
23 }
24
25 func (en *Req) Marshal(dst []byte) (b []byte) {
26 b = dst
27 b = Marshal(b, ReqLabel, func(bst []byte) (o []byte) {
28 o = bst
29 o = append(o, '"')
30 o = append(o, en.Subscription...)
31 o = append(o, '"')
32 for _, f := range *en.Filters {
33 o = append(o, ',')
34 o = f.Marshal(o)
35 }
36 return
37 })
38 return
39 }
40
41 func (en *Req) Unmarshal(b []byte) (r []byte, err error) {
42 r = b
43 if en.Subscription, r, err = text.UnmarshalQuoted(r); chk.E(err) {
44 return
45 }
46 if r, err = text.Comma(r); chk.E(err) {
47 return
48 }
49 en.Filters = &filter.S{}
50 if r, err = en.Filters.Unmarshal(r); chk.E(err) {
51 return
52 }
53 r, err = SkipToTheEnd(r)
54 return
55 }
56