kinds.mx raw
1 package kind
2
3 import (
4 "smesh.lol/pkg/nostr/ints"
5 "smesh.lol/pkg/lol/chk"
6 "smesh.lol/pkg/lol/errorf"
7 )
8
9 type S struct {
10 K []*K
11 }
12
13 func NewS(k ...*K) *S { return &S{k} }
14
15 func NewWithCap(c int) *S { return &S{[]*K{:0:c}} }
16
17 func FromIntSlice(is []int) (k *S) {
18 k = &S{}
19 for i := range is {
20 k.K = append(k.K, New(uint16(is[i])))
21 }
22 return
23 }
24
25 func (k *S) Len() int {
26 if k == nil {
27 return 0
28 }
29 return len(k.K)
30 }
31
32 func (k *S) Less(i, j int) bool { return k.K[i].K < k.K[j].K }
33
34 func (k *S) Swap(i, j int) {
35 k.K[i].K, k.K[j].K = k.K[j].K, k.K[i].K
36 }
37
38 func (k *S) ToUint16() (o []uint16) {
39 for i := range k.K {
40 o = append(o, k.K[i].ToU16())
41 }
42 return
43 }
44
45 func (k *S) Clone() (c *S) {
46 c = &S{K: []*K{:len(k.K)}}
47 for i := range k.K {
48 c.K[i] = k.K[i]
49 }
50 return
51 }
52
53 func (k *S) Contains(s uint16) bool {
54 for i := range k.K {
55 if k.K[i].Equal(s) {
56 return true
57 }
58 }
59 return false
60 }
61
62 func (k *S) Equals(t1 *S) bool {
63 if len(k.K) != len(t1.K) {
64 return false
65 }
66 for i := range k.K {
67 if k.K[i] != t1.K[i] {
68 return false
69 }
70 }
71 return true
72 }
73
74 func (k *S) Marshal(dst []byte) (b []byte) {
75 b = dst
76 b = append(b, '[')
77 for i := range k.K {
78 b = k.K[i].Marshal(b)
79 if i != len(k.K)-1 {
80 b = append(b, ',')
81 }
82 }
83 b = append(b, ']')
84 return
85 }
86
87 func (k *S) Unmarshal(b []byte) (r []byte, err error) {
88 r = b
89 var openedBracket bool
90 for ; len(r) > 0; r = r[1:] {
91 if !openedBracket && r[0] == '[' {
92 openedBracket = true
93 continue
94 } else if openedBracket {
95 if r[0] == ']' {
96 return
97 } else if r[0] == ',' {
98 continue
99 }
100 kk := ints.New(0)
101 if r, err = kk.Unmarshal(r); chk.E(err) {
102 return
103 }
104 k.K = append(k.K, New(kk.Uint16()))
105 if r[0] == ']' {
106 r = r[1:]
107 return
108 }
109 }
110 }
111 if !openedBracket {
112 return nil, errorf.E([]byte("kinds: failed to unmarshal\n%s\n%s\n%s"), k, b, r)
113 }
114 return
115 }
116
117 func (k *S) IsPrivileged() bool {
118 for i := range k.K {
119 if IsPrivileged(k.K[i].K) {
120 return true
121 }
122 }
123 return false
124 }
125