mirror of
https://github.com/waku-org/go-multiaddr.git
synced 2025-02-22 19:18:14 +00:00
feat: zero-alloc ToIP
This is called frequently when querying the DHT.
This commit is contained in:
parent
e68f4d6331
commit
8838e2aa67
29
convert.go
29
convert.go
@ -11,6 +11,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var errIncorrectNetAddr = fmt.Errorf("incorrect network addr conversion")
|
var errIncorrectNetAddr = fmt.Errorf("incorrect network addr conversion")
|
||||||
|
var errNotIP = fmt.Errorf("multiaddr does not start with an IP address")
|
||||||
|
|
||||||
// FromNetAddr converts a net.Addr type to a Multiaddr.
|
// FromNetAddr converts a net.Addr type to a Multiaddr.
|
||||||
func FromNetAddr(a net.Addr) (ma.Multiaddr, error) {
|
func FromNetAddr(a net.Addr) (ma.Multiaddr, error) {
|
||||||
@ -100,20 +101,22 @@ func FromIP(ip net.IP) (ma.Multiaddr, error) {
|
|||||||
|
|
||||||
// ToIP converts a Multiaddr to a net.IP when possible
|
// ToIP converts a Multiaddr to a net.IP when possible
|
||||||
func ToIP(addr ma.Multiaddr) (net.IP, error) {
|
func ToIP(addr ma.Multiaddr) (net.IP, error) {
|
||||||
_, network, ip, _, hostname, err := dialArgComponents(addr)
|
var ip net.IP
|
||||||
if err != nil {
|
ma.ForEach(addr, func(c ma.Component) bool {
|
||||||
return nil, err
|
switch c.Protocol().Code {
|
||||||
}
|
case ma.P_IP6ZONE:
|
||||||
|
// we can't return these anyways.
|
||||||
if hostname {
|
return true
|
||||||
return nil, fmt.Errorf("non IP Multiaddr: %s %s", network, ip)
|
case ma.P_IP6, ma.P_IP4:
|
||||||
}
|
ip = net.IP(c.RawValue())
|
||||||
switch network {
|
return false
|
||||||
case "ip", "ip4", "ip6", "tcp", "tcp4", "tcp6", "udp", "udp4", "udp6":
|
}
|
||||||
return net.ParseIP(ip), nil
|
return false
|
||||||
default:
|
})
|
||||||
return nil, fmt.Errorf("non IP Multiaddr: %s %s", network, ip)
|
if ip == nil {
|
||||||
|
return nil, errNotIP
|
||||||
}
|
}
|
||||||
|
return ip, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// DialArgs is a convenience function that returns network and address as
|
// DialArgs is a convenience function that returns network and address as
|
||||||
|
Loading…
x
Reference in New Issue
Block a user