package manet
import (
"fmt"
"net"
"sync"
ma "github.com/multiformats/go-multiaddr"
)
type FromNetAddrFunc func (a net .Addr ) (ma .Multiaddr , error )
type ToNetAddrFunc func (ma ma .Multiaddr ) (net .Addr , error )
var defaultCodecs = NewCodecMap ()
func init() {
RegisterFromNetAddr (parseTCPNetAddr , "tcp" , "tcp4" , "tcp6" )
RegisterFromNetAddr (parseUDPNetAddr , "udp" , "udp4" , "udp6" )
RegisterFromNetAddr (parseIPNetAddr , "ip" , "ip4" , "ip6" )
RegisterFromNetAddr (parseIPPlusNetAddr , "ip+net" )
RegisterFromNetAddr (parseUnixNetAddr , "unix" )
RegisterToNetAddr (parseBasicNetMaddr , "tcp" , "udp" , "ip6" , "ip4" , "unix" )
}
type CodecMap struct {
addrParsers map [string ]FromNetAddrFunc
maddrParsers map [string ]ToNetAddrFunc
lk sync .Mutex
}
func NewCodecMap () *CodecMap {
return &CodecMap {
addrParsers : make (map [string ]FromNetAddrFunc ),
maddrParsers : make (map [string ]ToNetAddrFunc ),
}
}
func RegisterFromNetAddr (from FromNetAddrFunc , networks ...string ) {
defaultCodecs .RegisterFromNetAddr (from , networks ...)
}
func RegisterToNetAddr (to ToNetAddrFunc , protocols ...string ) {
defaultCodecs .RegisterToNetAddr (to , protocols ...)
}
func (cm *CodecMap ) RegisterFromNetAddr (from FromNetAddrFunc , networks ...string ) {
cm .lk .Lock ()
defer cm .lk .Unlock ()
for _ , n := range networks {
cm .addrParsers [n ] = from
}
}
func (cm *CodecMap ) RegisterToNetAddr (to ToNetAddrFunc , protocols ...string ) {
cm .lk .Lock ()
defer cm .lk .Unlock ()
for _ , p := range protocols {
cm .maddrParsers [p ] = to
}
}
func (cm *CodecMap ) getAddrParser (net string ) (FromNetAddrFunc , error ) {
cm .lk .Lock ()
defer cm .lk .Unlock ()
parser , ok := cm .addrParsers [net ]
if !ok {
return nil , fmt .Errorf ("unknown network %v" , net )
}
return parser , nil
}
func (cm *CodecMap ) getMaddrParser (name string ) (ToNetAddrFunc , error ) {
cm .lk .Lock ()
defer cm .lk .Unlock ()
p , ok := cm .maddrParsers [name ]
if !ok {
return nil , fmt .Errorf ("network not supported: %s" , name )
}
return p , nil
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .