docs: public static RuleParamType parse(String s) {
      // deprecated formats
      if ("i".equals(s) || "i{}".equals(s)) {
        return INTEGER;
      }
      if ("s".equals(s) || "s{}".equals(s) || "r".equals(s) || "REGULAR_EXPRESSION".equals(s)) {
        return STRING;
      }
      if ("b".equals(s)) {
        return BOOLEAN;
      }
      if (s.startsWith("s[")) {
        String values = StringUtils.substringBetween(s, "[", "]");
        return multipleListOfValues(StringUtils.split(values, ','));
      }
  
      // standard format
      String format = StringUtils.substringBefore(s, OPTION_SEPARATOR);
      String values = null;
      boolean multiple = false;
      String[] options = s.split(CSV_SPLIT_REGEX);
      for (String option : options) {
        String opt = StringEscapeUtils.unescapeCsv(option);
        if (opt.startsWith(VALUES_PARAM + PARAMETER_SEPARATOR)) {
          values = StringEscapeUtils.unescapeCsv(StringUtils.substringAfter(opt, VALUES_PARAM + PARAMETER_SEPARATOR));
        } else if (opt.startsWith(MULTIPLE_PARAM + PARAMETER_SEPARATOR)) {
          multiple = Boolean.parseBoolean(StringUtils.substringAfter(opt, MULTIPLE_PARAM + PARAMETER_SEPARATOR));
        }
      }
      if (values == null || StringUtils.isBlank(values)) {
        return new RuleParamType(format);
      }
      return new RuleParamType(format, multiple, values.split(CSV_SPLIT_REGEX));
    }