docs: static Map<String, Object> parseTextFormat(String type, String rdata) {
      if ("A".equals(type)) {
        return AData.create(rdata);
      } else if ("AAAA".equals(type)) {
        return AAAAData.create(rdata);
      } else if ("CNAME".equals(type)) {
        return CNAMEData.create(rdata);
      } else if ("MX".equals(type)) {
        List<String> parts = split(' ', rdata);
        return MXData.create(Integer.valueOf(parts.get(0)), parts.get(1));
      } else if ("NS".equals(type)) {
        return NSData.create(rdata);
      } else if ("PTR".equals(type)) {
        return PTRData.create(rdata);
      } else if ("SOA".equals(type)) {
        List<String> parts = split(' ', rdata);
        return SOAData.builder().mname(parts.get(0)).rname(parts.get(1))
            .serial(Integer.valueOf(parts.get(2)))
            .refresh(Integer.valueOf(parts.get(3))).retry(Integer.valueOf(parts.get(4)))
            .expire(Integer.valueOf(parts.get(5))).minimum(Integer.valueOf(parts.get(6))).build();
      } else if ("SPF".equals(type)) {
        // unquote
        return SPFData.create(rdata.substring(1, rdata.length() - 1));
      } else if ("SRV".equals(type)) {
        List<String> parts = split(' ', rdata);
        return SRVData.builder().priority(Integer.valueOf(parts.get(0)))
            .weight(Integer.valueOf(parts.get(1)))
            .port(Integer.valueOf(parts.get(2))).target(parts.get(3)).build();
      } else if ("TXT".equals(type)) {
        // unquote
        return TXTData.create(rdata.substring(1, rdata.length() - 1));
      } else {
        Map<String, Object> unknown = new LinkedHashMap<String, Object>();
        unknown.put("rdata", rdata);
        return unknown;
      }
    }