address.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. host, port, _ := net.SplitHostPort(address)
  20. if port == "" {
  21. port = "9092"
  22. }
  23. if host == "" {
  24. host = address
  25. }
  26. return &networkAddress{
  27. network: network,
  28. address: net.JoinHostPort(host, port),
  29. }
  30. }
  31. func makeMultiAddr(network string, addresses []string) net.Addr {
  32. multi := make(multiAddr, len(addresses))
  33. for i, address := range addresses {
  34. multi[i] = makeAddr(network, address)
  35. }
  36. return multi
  37. }
  38. type networkAddress struct {
  39. network string
  40. address string
  41. }
  42. func (a *networkAddress) Network() string { return a.network }
  43. func (a *networkAddress) String() string { return a.address }
  44. type multiAddr []net.Addr
  45. func (m multiAddr) Network() string { return m.join(net.Addr.Network) }
  46. func (m multiAddr) String() string { return m.join(net.Addr.String) }
  47. func (m multiAddr) join(f func(net.Addr) string) string {
  48. switch len(m) {
  49. case 0:
  50. return ""
  51. case 1:
  52. return f(m[0])
  53. }
  54. s := make([]string, len(m))
  55. for i, a := range m {
  56. s[i] = f(a)
  57. }
  58. return strings.Join(s, ",")
  59. }