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