Changeset 488 in code for trunk/msgstore.go
- Timestamp:
- Mar 31, 2021, 3:57:24 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/msgstore.go
r441 r488 2 2 3 3 import ( 4 "bytes" 5 "encoding/base64" 4 6 "fmt" 5 "strconv"6 "strings"7 7 "time" 8 8 9 "git.sr.ht/~sircmpwn/go-bare" 9 10 "gopkg.in/irc.v3" 10 11 ) … … 30 31 } 31 32 32 func formatMsgID(netID int64, entity, extra string) string { 33 return fmt.Sprintf("%v %v %v", netID, entity, extra) 33 type msgIDType uint 34 35 const ( 36 msgIDNone msgIDType = iota 37 msgIDMemory 38 msgIDFS 39 ) 40 41 const msgIDVersion uint = 0 42 43 type msgIDHeader struct { 44 Version uint 45 Network bare.Int 46 Target string 47 Type msgIDType 34 48 } 35 49 36 func parseMsgID(s string) (netID int64, entity, extra string, err error) { 37 l := strings.SplitN(s, " ", 3) 38 if len(l) != 3 { 39 return 0, "", "", fmt.Errorf("invalid message ID %q: expected 3 fields", s) 50 type msgIDBody interface { 51 msgIDType() msgIDType 52 } 53 54 func formatMsgID(netID int64, target string, body msgIDBody) string { 55 var buf bytes.Buffer 56 w := bare.NewWriter(&buf) 57 58 header := msgIDHeader{ 59 Version: msgIDVersion, 60 Network: bare.Int(netID), 61 Target: target, 62 Type: body.msgIDType(), 40 63 } 41 netID, err = strconv.ParseInt(l[0], 10, 64) 64 if err := bare.MarshalWriter(w, &header); err != nil { 65 panic(err) 66 } 67 if err := bare.MarshalWriter(w, body); err != nil { 68 panic(err) 69 } 70 return base64.RawURLEncoding.EncodeToString(buf.Bytes()) 71 } 72 73 func parseMsgID(s string, body msgIDBody) (netID int64, target string, err error) { 74 b, err := base64.RawURLEncoding.DecodeString(s) 42 75 if err != nil { 43 return 0, "", "", fmt.Errorf("invalid message ID %q: %v", s, err)76 return 0, "", fmt.Errorf("invalid internal message ID: %v", err) 44 77 } 45 return netID, l[1], l[2], nil 78 79 r := bare.NewReader(bytes.NewReader(b)) 80 81 var header msgIDHeader 82 if err := bare.UnmarshalBareReader(r, &header); err != nil { 83 return 0, "", fmt.Errorf("invalid internal message ID: %v", err) 84 } 85 86 if header.Version != msgIDVersion { 87 return 0, "", fmt.Errorf("invalid internal message ID: got version %v, want %v", header.Version, msgIDVersion) 88 } 89 90 if body != nil { 91 typ := body.msgIDType() 92 if header.Type != typ { 93 return 0, "", fmt.Errorf("invalid internal message ID: got type %v, want %v", header.Type, typ) 94 } 95 96 if err := bare.UnmarshalBareReader(r, body); err != nil { 97 return 0, "", fmt.Errorf("invalid internal message ID: %v", err) 98 } 99 } 100 101 return int64(header.Network), header.Target, nil 46 102 }
Note:
See TracChangeset
for help on using the changeset viewer.