go-multiaddr/registry.go
2016-05-04 14:09:13 -07:00

80 lines
1.8 KiB
Go

package manet
import (
"fmt"
"net"
"sync"
ma "github.com/jbenet/go-multiaddr"
)
type AddrParser func(a net.Addr) (ma.Multiaddr, error)
type MaddrParser func(ma ma.Multiaddr) (net.Addr, error)
var maddrParsers map[string]MaddrParser
var addrParsers map[string]AddrParser
var addrParsersLock sync.Mutex
type AddressSpec struct {
// NetNames is an array of strings that may be returned
// by net.Addr.Network() calls on addresses belonging to this type
NetNames []string
// Key is the string value for Multiaddr address keys
Key string
// ParseNetAddr parses a net.Addr belonging to this type into a multiaddr
ParseNetAddr AddrParser
// ConvertMultiaddr converts a multiaddr of this type back into a net.Addr
ConvertMultiaddr MaddrParser
// Protocol returns the multiaddr protocol struct for this type
Protocol ma.Protocol
}
func RegisterAddressType(a *AddressSpec) {
addrParsersLock.Lock()
defer addrParsersLock.Unlock()
for _, n := range a.NetNames {
addrParsers[n] = a.ParseNetAddr
}
maddrParsers[a.Key] = a.ConvertMultiaddr
}
func init() {
addrParsers = make(map[string]AddrParser)
maddrParsers = make(map[string]MaddrParser)
RegisterAddressType(tcpAddrSpec)
RegisterAddressType(udpAddrSpec)
RegisterAddressType(utpAddrSpec)
RegisterAddressType(ip4AddrSpec)
RegisterAddressType(ip6AddrSpec)
addrParsers["ip+net"] = parseIpPlusNetAddr
}
func getAddrParser(net string) (AddrParser, error) {
addrParsersLock.Lock()
defer addrParsersLock.Unlock()
parser, ok := addrParsers[net]
if !ok {
return nil, fmt.Errorf("unknown network %v", net)
}
return parser, nil
}
func getMaddrParser(name string) (MaddrParser, error) {
addrParsersLock.Lock()
defer addrParsersLock.Unlock()
p, ok := maddrParsers[name]
if !ok {
return nil, fmt.Errorf("network not supported: %s", name)
}
return p, nil
}