address.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package kafka
  2. import (
  3. "net"
  4. "strings"
  5. )
  6. // TCP constructs an address with the network set to "tcp".
  7. func TCP(address ...string) net.Addr { return makeNetAddr("tcp", address) }
  8. func makeNetAddr(network string, addresses []string) net.Addr {
  9. switch len(addresses) {
  10. case 0:
  11. return nil // maybe panic instead?
  12. case 1:
  13. return makeAddr(network, addresses[0])
  14. default:
  15. return makeMultiAddr(network, addresses)
  16. }
  17. }
  18. func makeAddr(network, address string) net.Addr {
  19. return &networkAddress{
  20. network: network,
  21. address: canonicalAddress(address),
  22. }
  23. }
  24. func makeMultiAddr(network string, addresses []string) net.Addr {
  25. multi := make(multiAddr, len(addresses))
  26. for i, address := range addresses {
  27. multi[i] = makeAddr(network, address)
  28. }
  29. return multi
  30. }
  31. type networkAddress struct {
  32. network string
  33. address string
  34. }
  35. func (a *networkAddress) Network() string { return a.network }
  36. func (a *networkAddress) String() string { return a.address }
  37. type multiAddr []net.Addr
  38. func (m multiAddr) Network() string { return m.join(net.Addr.Network) }
  39. func (m multiAddr) String() string { return m.join(net.Addr.String) }
  40. func (m multiAddr) join(f func(net.Addr) string) string {
  41. switch len(m) {
  42. case 0:
  43. return ""
  44. case 1:
  45. return f(m[0])
  46. }
  47. s := make([]string, len(m))
  48. for i, a := range m {
  49. s[i] = f(a)
  50. }
  51. return strings.Join(s, ",")
  52. }