forked from sgreben/flagvar
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathudp_addr.go
127 lines (110 loc) · 2.62 KB
/
udp_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"
)
// UDPAddr is a `flag.Value` for UDP addresses.
// The `Network` field is used if set, otherwise "udp".
type UDPAddr struct {
Network string
Value *net.UDPAddr
Text string
}
// Help returns a string suitable for inclusion in a flag help message.
func (fv *UDPAddr) Help() string {
return "a UDP address"
}
// Set is flag.Value.Set
func (fv *UDPAddr) Set(v string) error {
network := "udp"
if fv.Network != "" {
network = fv.Network
}
udpAddr, err := net.ResolveUDPAddr(network, v)
if err != nil {
return err
}
fv.Text = v
fv.Value = udpAddr
return nil
}
func (fv *UDPAddr) String() string {
return fv.Text
}
// UDPAddrs is a `flag.Value` for UDPAddr addresses.
// The `Network` field is used if set, otherwise "udp".
type UDPAddrs struct {
Network string
Values []*net.UDPAddr
Texts []string
}
// Help returns a string suitable for inclusion in a flag help message.
func (fv *UDPAddrs) Help() string {
return "a UDP address"
}
// Set is flag.Value.Set
func (fv *UDPAddrs) Set(v string) error {
network := "udp"
if fv.Network != "" {
network = fv.Network
}
udpAddr, err := net.ResolveUDPAddr(network, v)
if err != nil {
return err
}
fv.Texts = append(fv.Texts, v)
fv.Values = append(fv.Values, udpAddr)
return nil
}
func (fv *UDPAddrs) String() string {
return strings.Join(fv.Texts, ",")
}
// UDPAddrsCSV is a `flag.Value` for UDPAddr addresses.
// The `Network` field is used if set, otherwise "udp".
// 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 UDPAddrsCSV struct {
Network string
Separator string
Accumulate bool
Values []*net.UDPAddr
Texts []string
}
// Help returns a string suitable for inclusion in a flag help message.
func (fv *UDPAddrsCSV) Help() string {
separator := ","
if fv.Separator != "" {
separator = fv.Separator
}
return fmt.Sprintf("%q-separated list of UDP addresses", separator)
}
// Set is flag.Value.Set
func (fv *UDPAddrsCSV) Set(v string) error {
network := "udp"
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)
udpAddr, err := net.ResolveUDPAddr(network, part)
if err != nil {
return err
}
fv.Texts = append(fv.Texts, part)
fv.Values = append(fv.Values, udpAddr)
}
return nil
}
func (fv *UDPAddrsCSV) String() string {
return strings.Join(fv.Texts, ",")
}