docs: def _parse(line):
          """ Parse protocol and bound address from log message
  
          >>> AddrConsumer._parse('NONE')
          (None, None)
  
          >>> AddrConsumer._parse('[INFO ][i.c.p.h.CrateNettyHttpServerTransport] [Widderstein] publish_address {127.0.0.1:4200}, bound_addresses {[fe80::1]:4200}, {[::1]:4200}, {127.0.0.1:4200}')
          ('http', '127.0.0.1:4200')
  
          >>> AddrConsumer._parse('[INFO ][o.e.t.TransportService   ] [Widderstein] publish_address {127.0.0.1:4300}, bound_addresses {[fe80::1]:4300}, {[::1]:4300}, {127.0.0.1:4300}')
          ('transport', '127.0.0.1:4300')
  
          >>> AddrConsumer._parse('[INFO ][psql                     ] [Widderstein] publish_address {127.0.0.1:5432}, bound_addresses {127.0.0.1:5432}')
          ('psql', '127.0.0.1:5432')
          """
          m = AddrConsumer.ADDRESS_RE.match(line)
          if not m:
              return None, None
          protocol = m.group('protocol')
          protocol = AddrConsumer.PROTOCOL_MAP.get(protocol, protocol)
          return protocol, m.group('addr')