-
Notifications
You must be signed in to change notification settings - Fork 0
/
capabilities.go
88 lines (77 loc) · 1.67 KB
/
capabilities.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package protocol
import (
"fmt"
"strings"
)
type CapabilityType int
const (
VersionCapability CapabilityType = iota
ReaderCapability
IHaveCapability
PostCapability
NewNewsCapability
HdrCapability
OverCapability
ListCapability
ImplementationCapability
ModeReaderCapability
)
func (ct CapabilityType) String() string {
switch ct {
case VersionCapability:
return CapabilityNameVersion
case ReaderCapability:
return CapabilityNameReader
case IHaveCapability:
return CapabilityNameIHave
case PostCapability:
return CapabilityNamePost
case NewNewsCapability:
return CapabilityNameNewNews
case HdrCapability:
return CapabilityNameHdr
case OverCapability:
return CapabilityNameOver
case ListCapability:
return CapabilityNameList
case ImplementationCapability:
return CapabilityNameImplementation
case ModeReaderCapability:
return CapabilityNameModeReader
default:
return ""
}
}
type Capability struct {
Type CapabilityType
Params string // optional
}
type Capabilities []Capability
func (cs *Capabilities) Add(c Capability) {
for _, v := range *cs {
if v.Type == c.Type {
return // allowed only unique items
}
}
*cs = append(*cs, c)
}
func (cs *Capabilities) Remove(ct CapabilityType) {
for i, v := range *cs {
if v.Type == ct {
*cs = append((*cs)[:i], (*cs)[i+1:]...)
}
}
}
func (cs Capabilities) String() string {
sb := strings.Builder{}
sb.Write([]byte("101 Capability list:" + CRLF))
for _, v := range cs {
if v.Params != "" {
sb.Write([]byte(fmt.Sprintf("%s %s%s", v.Type, v.Params, CRLF)))
} else {
sb.Write([]byte(fmt.Sprintf("%s%s", v.Type, CRLF)))
}
}
sb.Write([]byte(MultilineEnding))
return sb.String()
}