6#include "validator_p.h"
8#include <Cutelyst/application.h>
9#include <Cutelyst/context.h>
10#include <Cutelyst/request.h>
12#include <QLoggingCategory>
17Q_LOGGING_CATEGORY(C_VALIDATOR,
"cutelyst.utils.validator", QtWarningMsg)
20 : d_ptr(new ValidatorPrivate(translationContext))
25 const char *translationContext)
26 : d_ptr(new ValidatorPrivate(validators, translationContext))
35 if (!d->validators.empty()) {
36 qDeleteAll(d->validators.begin(), d->validators.end());
37 d->validators.clear();
70 if (d->validators.empty()) {
71 qCWarning(C_VALIDATOR) <<
"Validation started with empty validator list.";
76 qCWarning(C_VALIDATOR) <<
"Validation started with empty parameters.";
80 const bool noTrimming = flags.testFlag(
NoTrimming);
85 v->setTrimBefore(
false);
98 if (stopOnFirstError) {
121 auto cb = avr.callback;
135 auto async =
new AsyncValidator{c};
137 &AsyncValidator::finished,
139 async->start(d->validators, flags, params);
148 auto cb = avr.callback;
152 auto async =
new AsyncValidator{c};
154 &AsyncValidator::finished,
156 async->start(d->validators, flags, params);
164 v->setTranslationContext(d->translationContext);
165 d->validators.push_back(v);
173void AsyncValidator::start(
const std::vector<ValidatorRule *> &validators,
174 Validator::ValidatorFlags flags,
177 if (validators.empty()) {
178 qCWarning(C_VALIDATOR) <<
"Validation started with empty validator list.";
179 Q_EMIT finished(m_result);
183 if (params.
empty()) {
184 qCWarning(C_VALIDATOR) <<
"Validation started with empty parameters.";
189 for (
auto validator : validators) {
190 m_validators.enqueue(validator);
200void AsyncValidator::doValidation()
202 if (m_validators.empty() || m_cancelValidation) {
203 Q_EMIT finished(m_result);
207 auto v = m_validators.dequeue();
209 if (m_context.isNull()) {
210 qCCritical(C_VALIDATOR)
211 <<
"Cutelyst context object was destroyed while performing validation";
214 QStringLiteral(
"Cutelyst context object was destroyed while performing validation."));
215 Q_EMIT finished(m_result);
220 if (singleResult.extra.isValid()) {
221 m_result.addExtra(v->field(), singleResult.extra);
225 m_result.addValue(v->field(), singleResult.value);
227 m_result.addError(v->field(), singleResult.errorMessage);
228 if (m_stopOnFirstError) {
229 m_cancelValidation =
true;
The Cutelyst application.
void loadTranslations(const QString &filename, const QString &directory={}, const QString &prefix={}, const QString &suffix={})
Coroutine awaitable for ValidatorResult.
void setStash(const QString &key, const QVariant &value)
ParamsMultiMap bodyParameters() const
ParamsMultiMap queryParameters() const
Provides information about performed validations.
void addExtra(const QString &field, const QVariant &extra)
void addValue(const QString &field, const QVariant &value)
QHash< QString, QStringList > errors() const noexcept
void addError(const QString &field, const QString &message)
QStringList errorStrings() const
Base class for all validator rules.
Validation processor for input data.
AwaitedValidatorResult coValidate(Context *c, ValidatorFlags flags=NoSpecialBehavior) const
ValidatorResult validate(Context *c, ValidatorFlags flags=NoSpecialBehavior) const
Validator(const char *translationContext=nullptr)
void addValidator(ValidatorRule *v)
static void loadTranslations(Application *app)
The Cutelyst namespace holds all public Cutelyst API.
QMultiMap< Key, T > & unite(QMultiMap< Key, T > &&other)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QVariant fromValue(T &&value)
bool isValid() const const
Contains the result of a single input parameter validation.