From d2925182fa2addf97d8a7dd21d54c2970b4914e1 Mon Sep 17 00:00:00 2001 From: Relintai Date: Sun, 3 Jul 2022 20:27:22 +0200 Subject: [PATCH] Cleaned up FormValidators, and reworked their api to fit the engine better. --- modules/web/html/form_validator.cpp | 376 +++++++++++++--------------- modules/web/html/form_validator.h | 131 ++++++---- 2 files changed, 260 insertions(+), 247 deletions(-) diff --git a/modules/web/html/form_validator.cpp b/modules/web/html/form_validator.cpp index ce4dd7751..8b6caefd6 100644 --- a/modules/web/html/form_validator.cpp +++ b/modules/web/html/form_validator.cpp @@ -1,11 +1,15 @@ #include "form_validator.h" -#include "web/http/request.h" +#include "../http/web_server_request.h" //FormFieldEntry -bool FormFieldEntry::validate(Request *request, const FormField *field, const String &data, Vector *errors) { - return true; +PoolStringArray FormFieldEntry::validate(Ref request, const Ref &field, const String &data) { + return call("_validate", request, field, data); +} + +PoolStringArray FormFieldEntry::_validate(Ref request, const Ref &field, const String &data) { + return PoolStringArray(); } FormFieldEntry::FormFieldEntry() { @@ -16,16 +20,14 @@ FormFieldEntry::~FormFieldEntry() { //FormExistsFieldEntry -bool FormExistsFieldEntry::validate(Request *request, const FormField *field, const String &data, Vector *errors) { - if (data == "") { - if (errors) { - errors->push_back(field->human_name + not_exists_error); - } +PoolStringArray FormExistsFieldEntry::_validate(Ref request, const Ref &field, const String &data) { + PoolStringArray errors; - return false; + if (data == "") { + errors.push_back(field->human_name + not_exists_error); } - return true; + return errors; } FormExistsFieldEntry::FormExistsFieldEntry() { @@ -36,33 +38,18 @@ FormExistsFieldEntry::~FormExistsFieldEntry() { //FormIntFieldEntry -bool FormIntFieldEntry::validate(Request *request, const FormField *field, const String &data, Vector *errors) { - //https://stackoverflow.com/questions/2844817/how-do-i-check-if-a-c-string-is-an-int +PoolStringArray FormIntFieldEntry::_validate(Ref request, const Ref &field, const String &data) { + PoolStringArray errors; if (data.empty()) { - return true; + return errors; } - if (((!isdigit(data[0])) && (data[0] != '-') && (data[0] != '+'))) { - if (errors) { - errors->push_back(field->human_name + not_int_error); - } - - return false; + if (!data.is_valid_integer()) { + errors.push_back(field->human_name + not_int_error); } - char *p; - strtol(data.c_str(), &p, 10); - - bool is_int = (*p == 0); - - if (!is_int) { - if (errors) { - errors->push_back(field->human_name + not_int_error); - } - } - - return is_int; + return errors; } FormIntFieldEntry::FormIntFieldEntry() { @@ -74,23 +61,18 @@ FormIntFieldEntry::~FormIntFieldEntry() { //FormFloatFieldEntry -bool FormFloatFieldEntry::validate(Request *request, const FormField *field, const String &data, Vector *errors) { +PoolStringArray FormFloatFieldEntry::_validate(Ref request, const Ref &field, const String &data) { + PoolStringArray errors; + if (data.empty()) { - return true; + return errors; } - //from https://stackoverflow.com/questions/447206/c-isfloat-function - char *ptr; - strtof(data.c_str(), &ptr); - bool is_float = (*ptr) == '\0'; - - if (!is_float) { - if (errors) { - errors->push_back(field->human_name + not_float_error); - } + if (!data.is_valid_float()) { + errors.push_back(field->human_name + not_float_error); } - return is_float; + return errors; } FormFloatFieldEntry::FormFloatFieldEntry() { @@ -101,18 +83,18 @@ FormFloatFieldEntry::~FormFloatFieldEntry() { //FormAlphaFieldEntry -bool FormAlphaFieldEntry::validate(Request *request, const FormField *field, const String &data, Vector *errors) { +PoolStringArray FormAlphaFieldEntry::_validate(Ref request, const Ref &field, const String &data) { + PoolStringArray errors; + for (int i = 0; i < data.size(); ++i) { if (!isalpha(data[i])) { - if (errors) { - errors->push_back(field->human_name + not_alpha_error); - } + errors.push_back(field->human_name + not_alpha_error); - return false; + return errors; } } - return true; + return errors; } FormAlphaFieldEntry::FormAlphaFieldEntry() { @@ -123,18 +105,18 @@ FormAlphaFieldEntry::~FormAlphaFieldEntry() { //FormAlphaNumericFieldEntry -bool FormAlphaNumericFieldEntry::validate(Request *request, const FormField *field, const String &data, Vector *errors) { +PoolStringArray FormAlphaNumericFieldEntry::_validate(Ref request, const Ref &field, const String &data) { + PoolStringArray errors; + for (int i = 0; i < data.size(); ++i) { if (!isalnum(data[i])) { - if (errors) { - errors->push_back(field->human_name + not_alpha_numeric_error); - } + errors.push_back(field->human_name + not_alpha_numeric_error); - return false; + return errors; } } - return true; + return errors; } FormAlphaNumericFieldEntry::FormAlphaNumericFieldEntry() { @@ -145,19 +127,18 @@ FormAlphaNumericFieldEntry::~FormAlphaNumericFieldEntry() { //FormNeedsLowercaseCharacterFieldEntry -bool FormNeedsLowercaseCharacterFieldEntry::validate(Request *request, const FormField *field, const String &data, Vector *errors) { +PoolStringArray FormNeedsLowercaseCharacterFieldEntry::_validate(Ref request, const Ref &field, const String &data) { + PoolStringArray errors; + for (int i = 0; i < data.size(); ++i) { if (islower(data[i])) { - - return true; + return errors; } } - if (errors) { - errors->push_back(field->human_name + does_not_have_lowercase_error); - } + errors.push_back(field->human_name + does_not_have_lowercase_error); - return false; + return errors; } FormNeedsLowercaseCharacterFieldEntry::FormNeedsLowercaseCharacterFieldEntry() { @@ -168,18 +149,17 @@ FormNeedsLowercaseCharacterFieldEntry::~FormNeedsLowercaseCharacterFieldEntry() //FormNeedsUppercaseCharacterFieldEntry -bool FormNeedsUppercaseCharacterFieldEntry::validate(Request *request, const FormField *field, const String &data, Vector *errors) { +PoolStringArray FormNeedsUppercaseCharacterFieldEntry::_validate(Ref request, const Ref &field, const String &data) { + PoolStringArray errors; for (int i = 0; i < data.size(); ++i) { if (isupper(data[i])) { - return true; + return errors; } } - if (errors) { - errors->push_back(field->human_name + does_not_have_uppercase_error); - } + errors.push_back(field->human_name + does_not_have_uppercase_error); - return false; + return errors; } FormNeedsUppercaseCharacterFieldEntry::FormNeedsUppercaseCharacterFieldEntry() { @@ -190,18 +170,17 @@ FormNeedsUppercaseCharacterFieldEntry::~FormNeedsUppercaseCharacterFieldEntry() //FormNeedsOtherCharacterFieldEntry -bool FormNeedsOtherCharacterFieldEntry::validate(Request *request, const FormField *field, const String &data, Vector *errors) { +PoolStringArray FormNeedsOtherCharacterFieldEntry::_validate(Ref request, const Ref &field, const String &data) { + PoolStringArray errors; for (int i = 0; i < data.size(); ++i) { if (!isalnum(data[i])) { - return true; + return errors; } } - if (errors) { - errors->push_back(field->human_name + does_not_have_other_error); - } + errors.push_back(field->human_name + does_not_have_other_error); - return false; + return errors; } FormNeedsOtherCharacterFieldEntry::FormNeedsOtherCharacterFieldEntry() { @@ -212,16 +191,13 @@ FormNeedsOtherCharacterFieldEntry::~FormNeedsOtherCharacterFieldEntry() { //FormMinimumLengthFieldEntry -bool FormMinimumLengthFieldEntry::validate(Request *request, const FormField *field, const String &data, Vector *errors) { +PoolStringArray FormMinimumLengthFieldEntry::_validate(Ref request, const Ref &field, const String &data) { + PoolStringArray errors; if (data.size() < min_length) { - if (errors) { - errors->push_back(field->human_name + does_not_have_min_length_errorf + min_length + does_not_have_min_length_errors); - } - - return false; + errors.push_back(field->human_name + does_not_have_min_length_errorf + itos(min_length) + does_not_have_min_length_errors); } - return true; + return errors; } FormMinimumLengthFieldEntry::FormMinimumLengthFieldEntry() { @@ -235,16 +211,14 @@ FormMinimumLengthFieldEntry::~FormMinimumLengthFieldEntry() { //FormMaximumLengthFieldEntry -bool FormMaximumLengthFieldEntry::validate(Request *request, const FormField *field, const String &data, Vector *errors) { - if (data.size() > max_length) { - if (errors) { - errors->push_back(field->human_name + does_not_have_max_length_errorf + max_length + does_not_have_max_length_errors); - } +PoolStringArray FormMaximumLengthFieldEntry::_validate(Ref request, const Ref &field, const String &data) { + PoolStringArray errors; - return false; + if (data.size() > max_length) { + errors.push_back(field->human_name + does_not_have_max_length_errorf + itos(max_length) + does_not_have_max_length_errors); } - return true; + return errors; } FormMaximumLengthFieldEntry::FormMaximumLengthFieldEntry() { @@ -258,21 +232,19 @@ FormMaximumLengthFieldEntry::~FormMaximumLengthFieldEntry() { //FormEmailFieldEntry -bool FormEmailFieldEntry::validate(Request *request, const FormField *field, const String &data, Vector *errors) { - if (data.size() == 0) { - if (errors) { - errors->push_back(field->human_name + email_format_error); - } +PoolStringArray FormEmailFieldEntry::_validate(Ref request, const Ref &field, const String &data) { + PoolStringArray errors; - return false; + if (data.size() == 0) { + errors.push_back(field->human_name + email_format_error); + + return errors; } if (!isalpha(data[0])) { - if (errors) { - errors->push_back(field->human_name + email_format_error); - } + errors.push_back(field->human_name + email_format_error); - return false; + return errors; } int dot_pos = -1; @@ -281,49 +253,41 @@ bool FormEmailFieldEntry::validate(Request *request, const FormField *field, con for (int i = 0; i < data.size(); ++i) { if (data[i] == '.') { if (dot_pos != -1) { - if (errors) { - errors->push_back(field->human_name + email_format_error); - } + errors.push_back(field->human_name + email_format_error); - return false; + return errors; } dot_pos = i; - return true; + return errors; } } if (dot_pos == -1) { - if (errors) { - errors->push_back(field->human_name + email_format_error); - } + errors.push_back(field->human_name + email_format_error); - return false; + return errors; } for (int i = 0; i < data.size(); ++i) { if (data[i] == '@') { if (at_pos != -1) { - if (errors) { - errors->push_back(field->human_name + email_format_error); - } + errors.push_back(field->human_name + email_format_error); - return false; + return errors; } at_pos = i; - return true; + return errors; } } if (at_pos == -1) { - if (errors) { - errors->push_back(field->human_name + email_format_error); - } + errors.push_back(field->human_name + email_format_error); - return false; + return errors; } for (int i = 0; i < data.size(); ++i) { @@ -332,15 +296,13 @@ bool FormEmailFieldEntry::validate(Request *request, const FormField *field, con } if (!isalnum(data[i])) { - if (errors) { - errors->push_back(field->human_name + email_format_error); - } + errors.push_back(field->human_name + email_format_error); - return false; + return errors; } } - return true; + return errors; } FormEmailFieldEntry::FormEmailFieldEntry() { @@ -351,16 +313,14 @@ FormEmailFieldEntry::~FormEmailFieldEntry() { //FormNeedToMatchOtherFieldEntry -bool FormNeedToMatchOtherFieldEntry::validate(Request *request, const FormField *field, const String &data, Vector *errors) { - if (data != request->get_parameter(other_field)) { - if (errors) { - errors->push_back(field->human_name + does_not_match_error + field->name + "."); - } +PoolStringArray FormNeedToMatchOtherFieldEntry::_validate(Ref request, const Ref &field, const String &data) { + PoolStringArray errors; - return false; + if (data != request->get_parameter(other_field)) { + errors.push_back(field->human_name + does_not_match_error + field->name + "."); } - return true; + return errors; } FormNeedToMatchOtherFieldEntry::FormNeedToMatchOtherFieldEntry() { @@ -371,115 +331,139 @@ FormNeedToMatchOtherFieldEntry::~FormNeedToMatchOtherFieldEntry() { //FormField -FormField *FormField::need_to_exist() { - add_entry(new FormExistsFieldEntry()); +Ref FormField::need_to_exist() { + Ref f; + f.instance(); + add_entry(f); - return this; + return Ref(this); } -FormField *FormField::need_to_be_int() { - add_entry(new FormIntFieldEntry()); +Ref FormField::need_to_be_int() { + Ref f; + f.instance(); + add_entry(f); - return this; + return Ref(this); } -FormField *FormField::need_to_be_float() { - add_entry(new FormFloatFieldEntry()); +Ref FormField::need_to_be_float() { + Ref f; + f.instance(); + add_entry(f); - return this; + return Ref(this); } -FormField *FormField::need_to_be_alpha() { - add_entry(new FormAlphaFieldEntry()); +Ref FormField::need_to_be_alpha() { + Ref f; + f.instance(); + add_entry(f); - return this; + return Ref(this); } -FormField *FormField::need_to_be_alpha_numeric() { - add_entry(new FormAlphaNumericFieldEntry()); +Ref FormField::need_to_be_alpha_numeric() { + Ref f; + f.instance(); + add_entry(f); - return this; + return Ref(this); } -FormField *FormField::need_to_have_lowercase_character() { - add_entry(new FormNeedsLowercaseCharacterFieldEntry()); +Ref FormField::need_to_have_lowercase_character() { + Ref f; + f.instance(); + add_entry(f); - return this; + return Ref(this); } -FormField *FormField::need_to_have_uppercase_character() { - add_entry(new FormNeedsUppercaseCharacterFieldEntry()); +Ref FormField::need_to_have_uppercase_character() { + Ref f; + f.instance(); + add_entry(f); - return this; + return Ref(this); } -FormField *FormField::need_to_have_other_character() { - add_entry(new FormNeedsOtherCharacterFieldEntry()); +Ref FormField::need_to_have_other_character() { + Ref f; + f.instance(); + add_entry(f); - return this; + return Ref(this); } -FormField *FormField::need_minimum_length(const int min_length) { - FormMinimumLengthFieldEntry *f = new FormMinimumLengthFieldEntry(); +Ref FormField::need_minimum_length(const int min_length) { + Ref f; + f.instance(); f->min_length = min_length; add_entry(f); - return this; + return Ref(this); } -FormField *FormField::need_maximum_length(const int max_length) { - FormMaximumLengthFieldEntry *f = new FormMaximumLengthFieldEntry(); +Ref FormField::need_maximum_length(const int max_length) { + Ref f; + f.instance(); f->max_length = max_length; add_entry(f); - return this; + return Ref(this); } -FormField *FormField::need_to_be_email() { - add_entry(new FormEmailFieldEntry()); +Ref FormField::need_to_be_email() { + Ref f; + f.instance(); + add_entry(f); - return this; + return Ref(this); } -FormField *FormField::need_to_match(const String &other) { - FormNeedToMatchOtherFieldEntry *f = new FormNeedToMatchOtherFieldEntry(); +Ref FormField::need_to_match(const String &other) { + Ref f; + f.instance(); + f->other_field = other; add_entry(f); - return this; + return Ref(this); } -FormField *FormField::ignore_if_not_exists() { +Ref FormField::ignore_if_not_exists() { _ignore_if_not_exists = true; - return this; + return Ref(this); } -FormField *FormField::ignore_if_other_field_not_exists(const String &other) { +Ref FormField::ignore_if_other_field_not_exists(const String &other) { _ignore_if_other_field_not_exists = true; _ignore_if_other_field_not_exist_field = other; - return this; + return Ref(this); } -void FormField::add_entry(FormFieldEntry *field) { +void FormField::add_entry(const Ref &field) { fields.push_back(field); } -bool FormField::validate(Request *request, Vector *errors) { +PoolStringArray FormField::validate(const Ref &request) { + return call("_validate", request); +} + +PoolStringArray FormField::_validate(Ref request) { String param = request->get_parameter(name); if (_ignore_if_not_exists && param == "") { - return true; + return PoolStringArray(); } if (_ignore_if_other_field_not_exists) { String op = request->get_parameter(_ignore_if_other_field_not_exist_field); if (op == "") { - return true; + return PoolStringArray(); } } - bool valid = true; + PoolStringArray arr; for (int i = 0; i < fields.size(); ++i) { - if (!fields[i]->validate(request, this, param, errors)) { - valid = false; - } + arr.append_array(fields.write[i]->validate(request, Ref(this), param)); } - return valid; + return arr; } FormField::FormField() { @@ -487,34 +471,32 @@ FormField::FormField() { _ignore_if_other_field_not_exists = false; } FormField::~FormField() { - for (int i = 0; i < fields.size(); ++i) { - delete fields[i]; - } - fields.clear(); } //FormValidator -bool FormValidator::validate(Request *request, Vector *errors) { - bool valid = true; - - for (int i = 0; i < fields.size(); ++i) { - - if (!fields[i]->validate(request, errors)) { - valid = false; - } - } - - return valid; +PoolStringArray FormValidator::validate(const Ref &request) { + return call("_validate", request); } -void FormValidator::add_field(FormField *field) { +PoolStringArray FormValidator::_validate(Ref request) { + PoolStringArray arr; + + for (int i = 0; i < fields.size(); ++i) { + arr.append_array(fields.write[i]->validate(request)); + } + + return arr; +} + +void FormValidator::add_field(const Ref &field) { fields.push_back(field); } -FormField *FormValidator::new_field(const String &name, const String &human_name) { - FormField *f = new FormField(); +Ref FormValidator::new_field(const String &name, const String &human_name) { + Ref f; + f.instance(); f->name = name; f->human_name = human_name; @@ -527,9 +509,5 @@ FormValidator::FormValidator() { } FormValidator::~FormValidator() { - for (int i = 0; i < fields.size(); ++i) { - delete fields[i]; - } - fields.clear(); } diff --git a/modules/web/html/form_validator.h b/modules/web/html/form_validator.h index 616807837..f6dffbf02 100644 --- a/modules/web/html/form_validator.h +++ b/modules/web/html/form_validator.h @@ -1,25 +1,31 @@ -#ifndef FORM_H -#define FORM_H +#ifndef HTTP_FORM_VALIDATOR_H +#define HTTP_FORM_VALIDATOR_H -#include "core/string.h" -#include "core/containers/vector.h" +#include "core/ustring.h" +#include "core/vector.h" -#include +#include "core/resource.h" class Request; class FormField; +class WebServerRequest; + +class FormFieldEntry : public Resource { + GDCLASS(FormFieldEntry, Resource); -class FormFieldEntry { public: - virtual bool validate(Request *request, const FormField* field, const String &data, Vector *errors); + PoolStringArray validate(Ref request, const Ref &field, const String &data); + virtual PoolStringArray _validate(Ref request, const Ref &field, const String &data); FormFieldEntry(); - virtual ~FormFieldEntry(); + ~FormFieldEntry(); }; class FormExistsFieldEntry : public FormFieldEntry { + GDCLASS(FormExistsFieldEntry, FormFieldEntry); + public: - virtual bool validate(Request *request, const FormField* field, const String &data, Vector *errors); + PoolStringArray _validate(Ref request, const Ref &field, const String &data); FormExistsFieldEntry(); ~FormExistsFieldEntry(); @@ -28,8 +34,10 @@ public: }; class FormIntFieldEntry : public FormFieldEntry { + GDCLASS(FormIntFieldEntry, FormFieldEntry); + public: - virtual bool validate(Request *request, const FormField* field, const String &data, Vector *errors); + PoolStringArray _validate(Ref request, const Ref &field, const String &data); FormIntFieldEntry(); ~FormIntFieldEntry(); @@ -38,8 +46,10 @@ public: }; class FormFloatFieldEntry : public FormFieldEntry { + GDCLASS(FormFloatFieldEntry, FormFieldEntry); + public: - virtual bool validate(Request *request, const FormField* field, const String &data, Vector *errors); + PoolStringArray _validate(Ref request, const Ref &field, const String &data); FormFloatFieldEntry(); ~FormFloatFieldEntry(); @@ -48,8 +58,10 @@ public: }; class FormAlphaFieldEntry : public FormFieldEntry { + GDCLASS(FormAlphaFieldEntry, FormFieldEntry); + public: - virtual bool validate(Request *request, const FormField* field, const String &data, Vector *errors); + PoolStringArray _validate(Ref request, const Ref &field, const String &data); FormAlphaFieldEntry(); ~FormAlphaFieldEntry(); @@ -58,8 +70,10 @@ public: }; class FormAlphaNumericFieldEntry : public FormFieldEntry { + GDCLASS(FormAlphaNumericFieldEntry, FormFieldEntry); + public: - virtual bool validate(Request *request, const FormField* field, const String &data, Vector *errors); + PoolStringArray _validate(Ref request, const Ref &field, const String &data); FormAlphaNumericFieldEntry(); ~FormAlphaNumericFieldEntry(); @@ -68,8 +82,10 @@ public: }; class FormNeedsLowercaseCharacterFieldEntry : public FormFieldEntry { + GDCLASS(FormNeedsLowercaseCharacterFieldEntry, FormFieldEntry); + public: - virtual bool validate(Request *request, const FormField* field, const String &data, Vector *errors); + PoolStringArray _validate(Ref request, const Ref &field, const String &data); FormNeedsLowercaseCharacterFieldEntry(); ~FormNeedsLowercaseCharacterFieldEntry(); @@ -78,8 +94,10 @@ public: }; class FormNeedsUppercaseCharacterFieldEntry : public FormFieldEntry { + GDCLASS(FormNeedsUppercaseCharacterFieldEntry, FormFieldEntry); + public: - virtual bool validate(Request *request, const FormField* field, const String &data, Vector *errors); + PoolStringArray _validate(Ref request, const Ref &field, const String &data); FormNeedsUppercaseCharacterFieldEntry(); ~FormNeedsUppercaseCharacterFieldEntry(); @@ -88,8 +106,10 @@ public: }; class FormNeedsOtherCharacterFieldEntry : public FormFieldEntry { + GDCLASS(FormNeedsOtherCharacterFieldEntry, FormFieldEntry); + public: - virtual bool validate(Request *request, const FormField* field, const String &data, Vector *errors); + PoolStringArray _validate(Ref request, const Ref &field, const String &data); FormNeedsOtherCharacterFieldEntry(); ~FormNeedsOtherCharacterFieldEntry(); @@ -98,8 +118,10 @@ public: }; class FormMinimumLengthFieldEntry : public FormFieldEntry { + GDCLASS(FormMinimumLengthFieldEntry, FormFieldEntry); + public: - virtual bool validate(Request *request, const FormField* field, const String &data, Vector *errors); + PoolStringArray _validate(Ref request, const Ref &field, const String &data); FormMinimumLengthFieldEntry(); ~FormMinimumLengthFieldEntry(); @@ -111,8 +133,10 @@ public: }; class FormMaximumLengthFieldEntry : public FormFieldEntry { + GDCLASS(FormMaximumLengthFieldEntry, FormFieldEntry); + public: - virtual bool validate(Request *request, const FormField* field, const String &data, Vector *errors); + PoolStringArray _validate(Ref request, const Ref &field, const String &data); FormMaximumLengthFieldEntry(); ~FormMaximumLengthFieldEntry(); @@ -124,8 +148,10 @@ public: }; class FormEmailFieldEntry : public FormFieldEntry { + GDCLASS(FormEmailFieldEntry, FormFieldEntry); + public: - virtual bool validate(Request *request, const FormField* field, const String &data, Vector *errors); + PoolStringArray _validate(Ref request, const Ref &field, const String &data); FormEmailFieldEntry(); ~FormEmailFieldEntry(); @@ -134,8 +160,10 @@ public: }; class FormNeedToMatchOtherFieldEntry : public FormFieldEntry { + GDCLASS(FormNeedToMatchOtherFieldEntry, FormFieldEntry); + public: - virtual bool validate(Request *request, const FormField* field, const String &data, Vector *errors); + PoolStringArray _validate(Ref request, const Ref &field, const String &data); FormNeedToMatchOtherFieldEntry(); ~FormNeedToMatchOtherFieldEntry(); @@ -147,54 +175,61 @@ public: //FormField -class FormField { +class FormField : public Resource { + GDCLASS(FormField, Resource); + public: String name; - String human_name; + String human_name; bool _ignore_if_not_exists; bool _ignore_if_other_field_not_exists; String _ignore_if_other_field_not_exist_field; - FormField *need_to_exist(); - FormField *need_to_be_int(); - FormField *need_to_be_float(); - FormField *need_to_be_alpha(); - FormField *need_to_be_alpha_numeric(); - FormField *need_to_have_lowercase_character(); - FormField *need_to_have_uppercase_character(); - FormField *need_to_have_other_character(); - FormField *need_minimum_length(const int min_length); - FormField *need_maximum_length(const int max_length); - FormField *need_to_be_email(); - FormField *need_to_match(const String &other); - FormField *ignore_if_not_exists(); - FormField *ignore_if_other_field_not_exists(const String &other); + Ref need_to_exist(); + Ref need_to_be_int(); + Ref need_to_be_float(); + Ref need_to_be_alpha(); + Ref need_to_be_alpha_numeric(); + Ref need_to_have_lowercase_character(); + Ref need_to_have_uppercase_character(); + Ref need_to_have_other_character(); + Ref need_minimum_length(const int min_length); + Ref need_maximum_length(const int max_length); + Ref need_to_be_email(); + Ref need_to_match(const String &other); + Ref ignore_if_not_exists(); + Ref ignore_if_other_field_not_exists(const String &other); - void add_entry(FormFieldEntry *field); + void add_entry(const Ref &field); - bool validate(Request *request, Vector *errors); + PoolStringArray validate(const Ref &request); + virtual PoolStringArray _validate(Ref request); FormField(); - virtual ~FormField(); + ~FormField(); - Vector fields; + Vector> fields; }; //FormValidator -class FormValidator { -public: - bool validate(Request *request, Vector *errors = nullptr); +class FormValidator : public Resource { + GDCLASS(FormValidator, Resource); - void add_field(FormField *field); - FormField *new_field(const String &name, const String &human_name); +public: + PoolStringArray validate(const Ref &request); + virtual PoolStringArray _validate(Ref request); + + void add_field(const Ref &field); + Ref new_field(const String &name, const String &human_name); FormValidator(); - virtual ~FormValidator(); + ~FormValidator(); - Vector fields; +protected: + Vector> fields; }; -#endif \ No newline at end of file +#endif