/
ipaddr.go
65 lines (48 loc) · 1.32 KB
/
ipaddr.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
package types // import "github.com/nathanaelle/useful.types"
import (
"bytes"
"errors"
"net"
)
// Wrapper Type for net.IP providing missing interfaces
// All the parsing and the validation are done by net.ParseIP
type IpAddr net.IP
func (d *IpAddr)byte_set(data []byte) (err error) {
dest := IpAddr(net.ParseIP(string(data)))
if dest == nil {
return errors.New("invalid IpAddr : "+string(data))
}
*d = dest
return nil
}
func (d *IpAddr)Get() interface{} {
return net.IP(*d)
}
func (d *IpAddr)Set(data string) error {
return d.byte_set([]byte(data))
}
func (d *IpAddr)UnmarshalTOML(data []byte) (err error) {
return d.byte_set(bytes.Trim(data,"\""))
}
func (d *IpAddr)String() string {
return net.IP(*d).String()
}
func (d *IpAddr)UnmarshalJSON(data []byte) (err error) {
return d.byte_set(bytes.Trim(data,"\""))
}
func (d *IpAddr)MarshalJSON() (data []byte,err error) {
return []byte("\""+d.String()+"\""),nil
}
func (d *IpAddr)UnmarshalText(data []byte) (err error) {
return d.byte_set(data)
}
func (d *IpAddr)MarshalText() (data []byte,err error) {
return []byte(d.String()),nil
}
func (d *IpAddr) ToTCPAddr(port string) (*net.TCPAddr, error) {
ip := net.IP(*d)
if ip.To4() == nil {
return net.ResolveTCPAddr( "tcp", "["+ip.String()+"]:"+port )
}
return net.ResolveTCPAddr( "tcp", ip.String()+":"+port )
}