package swarm

import (
	
	

	
	

	ma 
)

// TransportForDialing retrieves the appropriate transport for dialing the given
// multiaddr.
func ( *Swarm) ( ma.Multiaddr) transport.Transport {
	if  == nil {
		return nil
	}
	 := .Protocols()
	if len() == 0 {
		return nil
	}

	.transports.RLock()
	defer .transports.RUnlock()

	if len(.transports.m) == 0 {
		// make sure we're not just shutting down.
		if .transports.m != nil {
			log.Error("you have no transports configured")
		}
		return nil
	}
	if isRelayAddr() {
		return .transports.m[ma.P_CIRCUIT]
	}
	if ,  := peer.IDFromP2PAddr();  != "" {
		// This addr has a p2p component. Drop it so we can check transport.
		, _ = ma.SplitLast()
		if  == nil {
			return nil
		}
	}
	for ,  := range .transports.m {
		if .CanDial() {
			return 
		}
	}
	return nil
}

// TransportForListening retrieves the appropriate transport for listening on
// the given multiaddr.
func ( *Swarm) ( ma.Multiaddr) transport.Transport {
	 := .Protocols()
	if len() == 0 {
		return nil
	}

	.transports.RLock()
	defer .transports.RUnlock()
	if len(.transports.m) == 0 {
		return nil
	}

	 := .transports.m[[len()-1].Code]
	for ,  := range  {
		,  := .transports.m[.Code]
		if ! {
			continue
		}
		if .Proxy() {
			 = 
		}
	}
	return 
}

// AddTransport adds a transport to this swarm.
//
// Satisfies the Network interface from go-libp2p-transport.
func ( *Swarm) ( transport.Transport) error {
	 := .Protocols()

	if len() == 0 {
		return fmt.Errorf("useless transport handles no protocols: %T", )
	}

	.transports.Lock()
	defer .transports.Unlock()
	if .transports.m == nil {
		return ErrSwarmClosed
	}
	var  []string
	for ,  := range  {
		if ,  := .transports.m[];  {
			 := ma.ProtocolWithCode()
			 := .Name
			if  == "" {
				 = fmt.Sprintf("unknown (%d)", )
			}
			 = append(, )
		}
	}
	if len() > 0 {
		return fmt.Errorf(
			"transports already registered for protocol(s): %s",
			strings.Join(, ", "),
		)
	}

	for ,  := range  {
		.transports.m[] = 
	}
	return nil
}