|
1 | 1 | package flagsfiller |
2 | 2 |
|
3 | 3 | import ( |
4 | | - "flag" |
5 | 4 | "fmt" |
6 | 5 | "net" |
7 | | - "strings" |
| 6 | + "reflect" |
8 | 7 | ) |
9 | 8 |
|
10 | 9 | func init() { |
11 | | - supportedStructList["net.IPNet"] = struct{}{} |
| 10 | + RegisterSimpleType(ipConverter) |
| 11 | + RegisterSimpleType(ipnetConverter) |
| 12 | + RegisterSimpleType(macConverter) |
12 | 13 | } |
13 | 14 |
|
14 | | -type ipValue struct { |
15 | | - addr *net.IP |
16 | | -} |
17 | | - |
18 | | -func (v *ipValue) String() string { |
19 | | - if v.addr == nil { |
20 | | - return fmt.Sprint(nil) |
21 | | - } |
22 | | - return v.addr.String() |
23 | | -} |
24 | | - |
25 | | -func (v *ipValue) Set(s string) error { |
26 | | - *v.addr = net.ParseIP(s) |
27 | | - if *v.addr == nil { |
28 | | - return fmt.Errorf("invalid ip addr %v", s) |
29 | | - } |
30 | | - return nil |
31 | | -} |
32 | | - |
33 | | -func (f *FlagSetFiller) processIP(fieldRef interface{}, hasDefaultTag bool, tagDefault string, flagSet *flag.FlagSet, renamed string, usage string, aliases string) (err error) { |
34 | | - casted, ok := fieldRef.(*net.IP) |
35 | | - if !ok { |
36 | | - return f.processCustom( |
37 | | - fieldRef, |
38 | | - func(s string) (interface{}, error) { |
39 | | - value := net.ParseIP(s) |
40 | | - if value == nil { |
41 | | - return nil, fmt.Errorf("invalid IP address %s", s) |
42 | | - } |
43 | | - return value, nil |
44 | | - }, |
45 | | - hasDefaultTag, |
46 | | - tagDefault, |
47 | | - flagSet, |
48 | | - renamed, |
49 | | - usage, |
50 | | - aliases, |
51 | | - ) |
52 | | - } |
53 | | - |
54 | | - if hasDefaultTag { |
55 | | - *casted = net.ParseIP(tagDefault) |
56 | | - if *casted == nil { |
57 | | - return fmt.Errorf("failed to parse default into net.IP: %s", tagDefault) |
58 | | - } |
| 15 | +func ipConverter(s string, tag reflect.StructTag) (net.IP, error) { |
| 16 | + addr := net.ParseIP(s) |
| 17 | + if addr == nil { |
| 18 | + return nil, fmt.Errorf("%s is not a valid IP address", s) |
59 | 19 | } |
60 | | - flagSet.Var(&ipValue{casted}, renamed, usage) |
61 | | - if aliases != "" { |
62 | | - for _, alias := range strings.Split(aliases, ",") { |
63 | | - flagSet.Var(&ipValue{casted}, alias, usage) |
64 | | - } |
65 | | - } |
66 | | - return nil |
67 | | -} |
68 | | - |
69 | | -type ipnetValue struct { |
70 | | - prefix *net.IPNet |
71 | | -} |
72 | | - |
73 | | -func (v *ipnetValue) String() string { |
74 | | - if v.prefix == nil { |
75 | | - return fmt.Sprint(nil) |
76 | | - } |
77 | | - return v.prefix.String() |
| 20 | + return addr, nil |
78 | 21 | } |
79 | 22 |
|
80 | | -func (v *ipnetValue) Set(s string) error { |
81 | | - _, pr, err := net.ParseCIDR(s) |
| 23 | +func ipnetConverter(s string, tag reflect.StructTag) (net.IPNet, error) { |
| 24 | + _, prefix, err := net.ParseCIDR(s) |
82 | 25 | if err != nil { |
83 | | - return fmt.Errorf("invalid ip prefix %v", s) |
| 26 | + return net.IPNet{}, err |
84 | 27 | } |
85 | | - *v.prefix = *pr |
86 | | - return nil |
| 28 | + return *prefix, nil |
87 | 29 | } |
88 | 30 |
|
89 | | -func (f *FlagSetFiller) processIPNet(fieldRef interface{}, hasDefaultTag bool, tagDefault string, flagSet *flag.FlagSet, renamed string, usage string, aliases string) (err error) { |
90 | | - casted, ok := fieldRef.(*net.IPNet) |
91 | | - if !ok { |
92 | | - return f.processCustom( |
93 | | - fieldRef, |
94 | | - func(s string) (interface{}, error) { |
95 | | - _, value, err := net.ParseCIDR(s) |
96 | | - if err != nil { |
97 | | - return nil, fmt.Errorf("invalid IP prefix %s, %w", s, err) |
98 | | - } |
99 | | - return *value, nil |
100 | | - }, |
101 | | - hasDefaultTag, |
102 | | - tagDefault, |
103 | | - flagSet, |
104 | | - renamed, |
105 | | - usage, |
106 | | - aliases, |
107 | | - ) |
108 | | - } |
109 | | - |
110 | | - if hasDefaultTag { |
111 | | - _, casted, err = net.ParseCIDR(tagDefault) |
112 | | - if err != nil { |
113 | | - return fmt.Errorf("failed to parse default into net.IPNet: %s, %w", tagDefault, err) |
114 | | - } |
115 | | - } |
116 | | - flagSet.Var(&ipnetValue{casted}, renamed, usage) |
117 | | - if aliases != "" { |
118 | | - for _, alias := range strings.Split(aliases, ",") { |
119 | | - flagSet.Var(&ipnetValue{casted}, alias, usage) |
120 | | - } |
121 | | - } |
122 | | - return nil |
| 31 | +func macConverter(s string, tag reflect.StructTag) (net.HardwareAddr, error) { |
| 32 | + return net.ParseMAC(s) |
123 | 33 | } |
0 commit comments