6#include "validatorbetween_p.h"
17 const QString &defValKey)
18 :
ValidatorRule(*new ValidatorBetweenPrivate(field, type, min, max, messages, defValKey))
28 const QString v =
value(params);
38 case QMetaType::Short:
41 case QMetaType::LongLong:
43 const qlonglong val = c->
locale().toLongLong(v, &ok);
44 if (Q_UNLIKELY(!ok)) {
46 qCWarning(C_VALIDATOR).noquote().nospace()
48 <<
"\" into an integer number";
51 ValidatorBetweenPrivate::extractLongLong(c, params, d->min, &ok);
52 if (Q_UNLIKELY(!ok)) {
54 c,
static_cast<int>(ValidatorRulePrivate::ErrorType::InvalidMin));
55 qCWarning(C_VALIDATOR).noquote()
56 <<
"Invalid mininum comparison value:" << d->min;
59 ValidatorBetweenPrivate::extractLongLong(c, params, d->max, &ok);
60 if (Q_UNLIKELY(!ok)) {
62 c,
static_cast<int>(ValidatorRulePrivate::ErrorType::InvalidMax));
63 qCWarning(C_VALIDATOR).noquote()
64 <<
"Invalid maximum comparison value:" << d->max;
66 if ((val < min) || (val > max)) {
69 QVariantMap{{QStringLiteral(
"val"), val},
70 {QStringLiteral(
"min"), min},
71 {QStringLiteral(
"max"), max}});
72 qCDebug(C_VALIDATOR).noquote()
73 <<
debugString(c) << val <<
"is not between" << min <<
"and" << max;
81 case QMetaType::UChar:
82 case QMetaType::UShort:
84 case QMetaType::ULong:
85 case QMetaType::ULongLong:
87 const qulonglong val = v.toULongLong(&ok);
88 if (Q_UNLIKELY(!ok)) {
90 qCWarning(C_VALIDATOR).noquote().nospace()
92 <<
"\" into an unsigned integer number";
94 const qulonglong min =
95 ValidatorBetweenPrivate::extractULongLong(c, params, d->min, &ok);
96 if (Q_UNLIKELY(!ok)) {
98 c,
static_cast<int>(ValidatorRulePrivate::ErrorType::InvalidMin));
99 qCWarning(C_VALIDATOR).noquote()
100 <<
debugString(c) <<
"Invalid mininum comparison value:" << d->min;
102 const qulonglong max =
103 ValidatorBetweenPrivate::extractULongLong(c, params, d->max, &ok);
104 if (Q_UNLIKELY(!ok)) {
106 c,
static_cast<int>(ValidatorRulePrivate::ErrorType::InvalidMax));
107 qCWarning(C_VALIDATOR).noquote()
108 <<
debugString(c) <<
"Invalid maximum comparison value:" << d->max;
110 if ((val < min) || (val > max)) {
113 QVariantMap{{QStringLiteral(
"val"), val},
114 {QStringLiteral(
"min"), min},
115 {QStringLiteral(
"max"), max}});
116 qCDebug(C_VALIDATOR).noquote()
117 <<
debugString(c) << val <<
"is not between" << min <<
"and" << max;
125 case QMetaType::Float:
126 case QMetaType::Double:
128 const double val = v.toDouble(&ok);
129 if (Q_UNLIKELY(!ok)) {
131 qCWarning(C_VALIDATOR).noquote().nospace()
132 <<
debugString(c) <<
" Can not parse input \"" << v
133 <<
"\" into a floating point number";
135 const double min = ValidatorBetweenPrivate::extractDouble(c, params, d->min, &ok);
136 if (Q_UNLIKELY(!ok)) {
138 c,
static_cast<int>(ValidatorRulePrivate::ErrorType::InvalidMin));
139 qCWarning(C_VALIDATOR).noquote()
140 <<
debugString(c) <<
"Invalid mininum comparison value:" << d->min;
143 ValidatorBetweenPrivate::extractDouble(c, params, d->max, &ok);
144 if (Q_UNLIKELY(!ok)) {
146 c,
static_cast<int>(ValidatorRulePrivate::ErrorType::InvalidMax));
147 qCWarning(C_VALIDATOR).noquote()
148 <<
debugString(c) <<
"Invalid maximum comparison value:" << d->max;
150 if ((val < min) || (val > max)) {
153 QVariantMap{{QStringLiteral(
"val"), val},
154 {QStringLiteral(
"min"), min},
155 {QStringLiteral(
"max"), max}});
156 qCDebug(C_VALIDATOR).noquote()
157 <<
debugString(c) << val <<
"is not between" << min <<
"and" << max;
165 case QMetaType::QString:
167 const auto val =
static_cast<qlonglong
>(v.length());
168 const qlonglong min = ValidatorBetweenPrivate::extractLongLong(c, params, d->min, &ok);
169 if (Q_UNLIKELY(!ok)) {
171 c,
static_cast<int>(ValidatorRulePrivate::ErrorType::InvalidMin));
172 qCWarning(C_VALIDATOR).noquote()
173 <<
debugString(c) <<
"Invalid mininum comparison value:" << d->min;
175 const qlonglong max =
176 ValidatorBetweenPrivate::extractLongLong(c, params, d->max, &ok);
177 if (Q_UNLIKELY(!ok)) {
179 c,
static_cast<int>(ValidatorRulePrivate::ErrorType::InvalidMax));
180 qCWarning(C_VALIDATOR).noquote()
181 <<
debugString(c) <<
"Invalid maximum comparison value:" << d->max;
183 if ((val < min) || (val > max)) {
186 QVariantMap{{QStringLiteral(
"val"), val},
187 {QStringLiteral(
"min"), min},
188 {QStringLiteral(
"max"), max}});
189 qCDebug(C_VALIDATOR).noquote() <<
debugString(c) <<
"String length" << val
190 <<
"is not between" << min <<
"and" << max;
198 qCWarning(C_VALIDATOR).noquote()
199 <<
debugString(c) <<
"The comparison type" << d->type <<
"is not supported";
201 c,
static_cast<int>(ValidatorRulePrivate::ErrorType::InvalidType));
206 if (d->type != QMetaType::QString) {
207 const QVariant _v = ValidatorBetweenPrivate::valueToNumber(c, v, d->type);
214 result.
value.setValue(v);
230 const QVariant &errorData)
const
234 const QVariantMap map = errorData.toMap();
238 case QMetaType::Char:
239 case QMetaType::Short:
241 case QMetaType::Long:
242 case QMetaType::LongLong:
243 case QMetaType::QString:
244 min = c->
locale().toString(map.value(QStringLiteral(
"min")).toLongLong());
245 max = c->
locale().toString(map.value(QStringLiteral(
"max")).toLongLong());
247 case QMetaType::UChar:
248 case QMetaType::UShort:
249 case QMetaType::UInt:
250 case QMetaType::ULong:
251 case QMetaType::ULongLong:
252 min = c->
locale().toString(map.value(QStringLiteral(
"min")).toULongLong());
253 max = c->
locale().toString(map.value(QStringLiteral(
"max")).toULongLong());
255 case QMetaType::Float:
256 case QMetaType::Double:
257 min = c->
locale().toString(map.value(QStringLiteral(
"min")).toDouble());
258 max = c->
locale().toString(map.value(QStringLiteral(
"max")).toDouble());
264 const QString _label =
label(c);
266 if (_label.isEmpty()) {
267 if (d->type == QMetaType::QString) {
270 return c->
qtTrId(
"cutelyst-valbetween-genvalerr-string").arg(min, max);
274 return c->
qtTrId(
"cutelyst-valbetween-genvalerr-num").arg(min, max);
277 if (d->type == QMetaType::QString) {
281 return c->
qtTrId(
"cutelyst-valbetween-genvalerr-string-label").arg(_label, min, max);
286 return c->
qtTrId(
"cutelyst-valbetween-genvalerr-num-label").arg(_label, min, max);
295 const auto errorType =
static_cast<ValidatorRulePrivate::ErrorType
>(errorData.toInt());
296 const QString _label =
label(c);
298 if (_label.isEmpty()) {
300 case ValidatorRulePrivate::ErrorType::InvalidMin:
302 return c->
qtTrId(
"cutelyst-validator-genvaldataerr-min");
303 case ValidatorRulePrivate::ErrorType::InvalidType:
306 QMetaType _type(d->type);
309 return c->
qtTrId(
"cutelyst-validator-genvaldataerr-type")
310 .arg(QString::fromLatin1(_type.name()));
312 case ValidatorRulePrivate::ErrorType::InvalidMax:
314 return c->
qtTrId(
"cutelyst-validator-genvaldataerr-max");
318 case ValidatorRulePrivate::ErrorType::InvalidMin:
321 return c->
qtTrId(
"cutelyst-validator-genvaldataerr-min-label").arg(_label);
322 case ValidatorRulePrivate::ErrorType::InvalidType:
325 QMetaType _type(d->type);
328 return c->
qtTrId(
"cutelyst-validator-genvaldataerr-type-label")
329 .arg(QString::fromLatin1(_type.name()), _label);
331 case ValidatorRulePrivate::ErrorType::InvalidMax:
334 return c->
qtTrId(
"cutelyst-validator-genvaldataerr-max-label").arg(_label);
346 const QString _label =
label(c);
347 if ((d->type == QMetaType::Float) || (d->type == QMetaType::Double)) {
348 if (_label.isEmpty()) {
350 return c->
qtTrId(
"cutelyst-validator-genparseerr-float");
355 return c->
qtTrId(
"cutelyst-validator-genparseerr-float-label").arg(_label);
358 if (_label.isEmpty()) {
360 return c->
qtTrId(
"cutelyst-validator-genparseerr-int");
364 return c->
qtTrId(
"cutelyst-validator-genparseerr-int-label").arg(_label);
QLocale locale() const noexcept
QString qtTrId(const char *id, int n=-1) const
Checks if a value or text length is between a minimum and maximum value.
ValidatorBetween(const QString &field, QMetaType::Type type, const QVariant &min, const QVariant &max, const ValidatorMessages &messages=ValidatorMessages(), const QString &defValKey={})
void validateCb(Context *c, const ParamsMultiMap ¶ms, ValidatorRtFn cb) const override
QString genericValidationError(Context *c, const QVariant &errorData=QVariant()) const override
ValidatorReturnType validate(Context *c, const ParamsMultiMap ¶ms) const override
~ValidatorBetween() override
QString genericParsingError(Context *c, const QVariant &errorData) const override
QString genericValidationDataError(Context *c, const QVariant &errorData) const override
Base class for all validator rules.
QString validationError(Context *c, const QVariant &errorData={}) const
QString label(const Context *c) const
QString debugString(const Context *c) const
QString validationDataError(Context *c, const QVariant &errorData={}) const
std::function< void(ValidatorReturnType &&result)> ValidatorRtFn
Void callback function for validator rules that processes the ValidatorReturnType.
void defaultValue(Context *c, ValidatorReturnType *result) const
QString value(const ParamsMultiMap ¶ms) const
QString parsingError(Context *c, const QVariant &errorData={}) const
QMultiMap< QString, QString > ParamsMultiMap
The Cutelyst namespace holds all public Cutelyst API.
Stores custom error messages and the input field label.
Contains the result of a single input parameter validation.