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