1 // Package tlv implements a simple Type Length Value encoder for nostr NIP-19
2 // bech32 encoded entities. The format is generic and could also be used for any
3 // TLV use case where fields are less than 255 bytes.
4 package tlv
5 6 import (
7 "io"
8 )
9 10 const (
11 Default byte = iota
12 Relay
13 Author
14 Kind
15 )
16 17 // ReadEntry reads a TLV value from a bech32 encoded nostr entity.
18 func ReadEntry(buf io.Reader) (typ uint8, value []byte) {
19 var err error
20 t := make([]byte, 1)
21 if _, err = buf.Read(t); err != nil {
22 return
23 }
24 typ = t[0]
25 l := make([]byte, 1)
26 if _, err = buf.Read(l); err != nil {
27 return
28 }
29 length := int(l[0])
30 value = make([]byte, length)
31 if _, err = buf.Read(value); err != nil {
32 // nil value signals end of data or error
33 value = nil
34 }
35 return
36 }
37 38 // WriteEntry writes a TLV value for a bech32 encoded nostr entity.
39 func WriteEntry(buf io.Writer, typ uint8, value []byte) {
40 buf.Write(append([]byte{typ, byte(len(value))}, value...))
41 }
42