private static Rule<View> getEmailRule(Field field, View view, Email email) {
    if (!TextView.class.isAssignableFrom(view.getClass())) {
      Log.w(TAG, String.format(WARN_TEXT, field.getName(), Regex.class.getSimpleName()));
      return null;
    }
    //		int messageResId = email.messageResId();
    //		String message = messageResId != 0 ? view.getContext().getString(messageResId) :
    // email.message();
    //		return Rules.or(message, Rules.eq(null, Rules.EMPTY_STRING), Rules.regex(message,
    // Rules.REGEX_EMAIL, true));

    int messageResId = email.messageResId();
    String message =
        messageResId != 0 ? view.getContext().getString(messageResId) : email.message();

    if (email.empty()) {
      return Rules.or(
          message,
          Rules.eq(null, Rules.EMPTY_STRING),
          Rules.regex(message, Rules.REGEX_EMAIL, true));
    }
    List<Rule<?>> rules = new ArrayList<Rule<?>>();
    rules.add(Rules.required(message, true));
    rules.add(Rules.regex(message, Rules.REGEX_EMAIL, true));
    Rule<?>[] ruleArray = new Rule<?>[rules.size()];
    rules.toArray(ruleArray);
    return Rules.and(message, ruleArray);
  }
  private static Rule<View> getIpAddressRule(Field field, View view, IpAddress ipAddress) {
    if (!TextView.class.isAssignableFrom(view.getClass())) {
      Log.w(TAG, String.format(WARN_TEXT, field.getName(), IpAddress.class.getSimpleName()));
      return null;
    }

    int messageResId = ipAddress.messageResId();
    String message =
        messageResId != 0 ? view.getContext().getString(messageResId) : ipAddress.message();

    return Rules.or(
        message,
        Rules.eq(null, Rules.EMPTY_STRING),
        Rules.regex(message, Rules.REGEX_IP_ADDRESS, true));
  }
  private static Rule<TextView> getRegexRule(Field field, View view, Regex regexRule) {
    if (!TextView.class.isAssignableFrom(view.getClass())) {
      Log.w(TAG, String.format(WARN_TEXT, field.getName(), Regex.class.getSimpleName()));
      return null;
    }

    Context context = view.getContext();
    int messageResId = regexRule.messageResId();
    String message = messageResId != 0 ? context.getString(messageResId) : regexRule.message();

    int patternResId = regexRule.patternResId();
    String pattern =
        patternResId != 0 ? view.getContext().getString(patternResId) : regexRule.pattern();

    return Rules.regex(message, pattern, regexRule.trim());
  }
  private static Rule<View> getNumberRule(Field field, View view, NumberRule numberRule) {
    if (!TextView.class.isAssignableFrom(view.getClass())) {
      Log.w(TAG, String.format(WARN_TEXT, field.getName(), NumberRule.class.getSimpleName()));
      return null;
    } else if (numberRule.type() == null) {
      throw new IllegalArgumentException(
          String.format("@%s.type() cannot be null.", NumberRule.class.getSimpleName()));
    }

    List<Rule<?>> rules = new ArrayList<Rule<?>>();
    int messageResId = numberRule.messageResId();
    String message =
        messageResId != 0 ? view.getContext().getString(messageResId) : numberRule.message();

    switch (numberRule.type()) {
      case INTEGER:
      case LONG:
        Rules.regex(null, Rules.REGEX_INTEGER, true);
        break;
      case FLOAT:
      case DOUBLE:
        Rules.regex(null, Rules.REGEX_DECIMAL, true);
        break;
    }

    if (numberRule.lt() != Double.MIN_VALUE) {
      String ltNumber = String.valueOf(numberRule.lt());
      double number = Double.parseDouble(ltNumber);
      switch (numberRule.type()) {
        case INTEGER:
          rules.add(Rules.lt(null, ((int) number)));
          break;
        case LONG:
          rules.add(Rules.lt(null, ((long) number)));
          break;
        case FLOAT:
          rules.add(Rules.lt(null, Float.parseFloat(ltNumber)));
          break;
        case DOUBLE:
          rules.add(Rules.lt(null, Double.parseDouble(ltNumber)));
          break;
      }
    }
    if (numberRule.gt() != Double.MAX_VALUE) {
      String gtNumber = String.valueOf(numberRule.gt());
      double number = Double.parseDouble(gtNumber);
      switch (numberRule.type()) {
        case INTEGER:
          rules.add(Rules.gt(null, ((int) number)));
          break;
        case LONG:
          rules.add(Rules.gt(null, ((long) number)));
          break;
        case FLOAT:
          rules.add(Rules.gt(null, Float.parseFloat(gtNumber)));
          break;
        case DOUBLE:
          rules.add(Rules.gt(null, Double.parseDouble(gtNumber)));
          break;
      }
    }
    if (numberRule.eq() != Double.MAX_VALUE) {
      String eqNumber = String.valueOf(numberRule.eq());
      double number = Double.parseDouble(eqNumber);
      switch (numberRule.type()) {
        case INTEGER:
          rules.add(Rules.eq(null, ((int) number)));
          break;
        case LONG:
          rules.add(Rules.eq(null, ((long) number)));
          break;
        case FLOAT:
          rules.add(Rules.eq(null, Float.parseFloat(eqNumber)));
          break;
        case DOUBLE:
          rules.add(Rules.eq(null, Double.parseDouble(eqNumber)));
          break;
      }
    }

    Rule<?>[] ruleArray = new Rule<?>[rules.size()];
    rules.toArray(ruleArray);

    return Rules.and(message, ruleArray);
  }