envelopes_default.go raw

   1  //go:build !sonic
   2  
   3  package nostr
   4  
   5  import (
   6  	"errors"
   7  	"strings"
   8  )
   9  
  10  func NewMessageParser() MessageParser {
  11  	return messageParser{}
  12  }
  13  
  14  type messageParser struct{}
  15  
  16  func (messageParser) ParseMessage(message string) (Envelope, error) {
  17  	firstQuote := strings.IndexRune(message, '"')
  18  	if firstQuote == -1 {
  19  		return nil, errors.New("malformed json")
  20  	}
  21  	secondQuote := strings.IndexRune(message[firstQuote+1:], '"')
  22  	if secondQuote == -1 {
  23  		return nil, errors.New("malformed json")
  24  	}
  25  	label := message[firstQuote+1 : firstQuote+1+secondQuote]
  26  
  27  	var v Envelope
  28  	switch label {
  29  	case "EVENT":
  30  		v = &EventEnvelope{}
  31  	case "REQ":
  32  		v = &ReqEnvelope{}
  33  	case "COUNT":
  34  		v = &CountEnvelope{}
  35  	case "NOTICE":
  36  		x := NoticeEnvelope("")
  37  		v = &x
  38  	case "EOSE":
  39  		x := EOSEEnvelope("")
  40  		v = &x
  41  	case "OK":
  42  		v = &OKEnvelope{}
  43  	case "AUTH":
  44  		v = &AuthEnvelope{}
  45  	case "CLOSED":
  46  		v = &ClosedEnvelope{}
  47  	case "CLOSE":
  48  		x := CloseEnvelope("")
  49  		v = &x
  50  	default:
  51  		return nil, UnknownLabel
  52  	}
  53  
  54  	if err := v.FromJSON(message); err != nil {
  55  		return nil, err
  56  	}
  57  	return v, nil
  58  }
  59