-
Notifications
You must be signed in to change notification settings - Fork 4
/
tcp_addr.go
127 lines (110 loc) · 2.62 KB
/
tcp_addr.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package flagvar
import (
"fmt"
"strings"
"net"
)
// TCPAddr is a `flag.Value` for TCP addresses.
// The `Network` field is used if set, otherwise "tcp".
type TCPAddr struct {
Network string
Value *net.TCPAddr
Text string
}
// Help returns a string suitable for inclusion in a flag help message.
func (fv *TCPAddr) Help() string {
return "a TCP address"
}
// Set is flag.Value.Set
func (fv *TCPAddr) Set(v string) error {
network := "tcp"
if fv.Network != "" {
network = fv.Network
}
tcpAddr, err := net.ResolveTCPAddr(network, v)
if err != nil {
return err
}
fv.Text = v
fv.Value = tcpAddr
return nil
}
func (fv *TCPAddr) String() string {
return fv.Text
}
// TCPAddrs is a `flag.Value` for TCPAddr addresses.
// The `Network` field is used if set, otherwise "tcp".
type TCPAddrs struct {
Network string
Values []*net.TCPAddr
Texts []string
}
// Help returns a string suitable for inclusion in a flag help message.
func (fv *TCPAddrs) Help() string {
return "a TCP address"
}
// Set is flag.Value.Set
func (fv *TCPAddrs) Set(v string) error {
network := "tcp"
if fv.Network != "" {
network = fv.Network
}
tcpAddr, err := net.ResolveTCPAddr(network, v)
if err != nil {
return err
}
fv.Texts = append(fv.Texts, v)
fv.Values = append(fv.Values, tcpAddr)
return nil
}
func (fv *TCPAddrs) String() string {
return strings.Join(fv.Texts, ",")
}
// TCPAddrsCSV is a `flag.Value` for TCPAddr addresses.
// The `Network` field is used if set, otherwise "tcp".
// If `Accumulate` is set, the values of all instances of the flag are accumulated.
// The `Separator` field is used instead of the comma when set.
type TCPAddrsCSV struct {
Network string
Separator string
Accumulate bool
Values []*net.TCPAddr
Texts []string
}
// Help returns a string suitable for inclusion in a flag help message.
func (fv *TCPAddrsCSV) Help() string {
separator := ","
if fv.Separator != "" {
separator = fv.Separator
}
return fmt.Sprintf("%q-separated list of TCP addresses", separator)
}
// Set is flag.Value.Set
func (fv *TCPAddrsCSV) Set(v string) error {
network := "tcp"
if fv.Network != "" {
network = fv.Network
}
separator := fv.Separator
if separator == "" {
separator = ","
}
if !fv.Accumulate {
fv.Values = fv.Values[:0]
fv.Texts = fv.Texts[:0]
}
parts := strings.Split(v, separator)
for _, part := range parts {
part = strings.TrimSpace(part)
tcpAddr, err := net.ResolveTCPAddr(network, part)
if err != nil {
return err
}
fv.Texts = append(fv.Texts, part)
fv.Values = append(fv.Values, tcpAddr)
}
return nil
}
func (fv *TCPAddrsCSV) String() string {
return strings.Join(fv.Texts, ",")
}