package multiaddr import ( "fmt" "net" ) var errIncorrectNetAddr = fmt.Errorf("incorrect network addr conversion") // FromNetAddr converts a net.Addr type to a Multiaddr. func FromNetAddr(a net.Addr) (*Multiaddr, error) { switch a.Network() { case "tcp", "tcp4", "tcp6": ac, ok := a.(*net.TCPAddr) if !ok { return nil, errIncorrectNetAddr } // Get IP Addr ipm, err := FromIP(ac.IP) if err != nil { return nil, errIncorrectNetAddr } // Get TCP Addr tcpm, err := NewMultiaddr(fmt.Sprintf("/tcp/%d", ac.Port)) if err != nil { return nil, errIncorrectNetAddr } // Encapsulate return ipm.Encapsulate(tcpm), nil case "udp", "upd4", "udp6": ac, ok := a.(*net.UDPAddr) if !ok { return nil, errIncorrectNetAddr } // Get IP Addr ipm, err := FromIP(ac.IP) if err != nil { return nil, errIncorrectNetAddr } // Get UDP Addr udpm, err := NewMultiaddr(fmt.Sprintf("/udp/%d", ac.Port)) if err != nil { return nil, errIncorrectNetAddr } // Encapsulate return ipm.Encapsulate(udpm), nil case "ip", "ip4", "ip6": ac, ok := a.(*net.IPAddr) if !ok { return nil, errIncorrectNetAddr } return FromIP(ac.IP) default: return nil, fmt.Errorf("unknown network %v", a.Network()) } } // FromIP converts a net.IP type to a Multiaddr. func FromIP(ip net.IP) (*Multiaddr, error) { switch { case ip.To4() != nil: return NewMultiaddr("/ip4/" + ip.String()) case ip.To16() != nil: return NewMultiaddr("/ip6/" + ip.String()) default: return nil, errIncorrectNetAddr } }