cutelyst  5.0.1
A C++ Web Framework built on top of Qt, using the simple approach of Catalyst (Perl) framework.
validatorinteger.cpp
1 /*
2  * SPDX-FileCopyrightText: (C) 2017-2025 Matthias Fehring <mf@huessenbergnetz.de>
3  * SPDX-License-Identifier: BSD-3-Clause
4  */
5 
6 #include "validatorinteger_p.h"
7 
8 using namespace Cutelyst;
9 
11  QMetaType::Type type,
12  const Cutelyst::ValidatorMessages &messages,
13  const QString &defValKey)
14  : ValidatorRule(*new ValidatorIntegerPrivate(field, type, messages, defValKey))
15 {
16 }
17 
19 
21  const ParamsMultiMap &params) const
22 {
23  ValidatorReturnType result;
24 
25  const QString v = value(params);
26 
27  if (!v.isEmpty()) {
28  Q_D(const ValidatorInteger);
29  QVariant converted;
30 
31  switch (d->type) {
32  case QMetaType::Char:
33  case QMetaType::Short:
34  case QMetaType::Int:
35  case QMetaType::Long:
37  case QMetaType::UChar:
38  case QMetaType::UShort:
39  case QMetaType::UInt:
40  case QMetaType::ULong:
42  converted = ValidatorIntegerPrivate::valueToNumber(c, v, d->type);
43  break;
44  default:
46  qCWarning(C_VALIDATOR).noquote()
47  << debugString(c) << "Conversion type" << d->type << "is not an integer type";
48  break;
49  }
50 
51  if (converted.isValid()) {
52  result.value = converted;
53  } else {
54  qCDebug(C_VALIDATOR).noquote().nospace()
55  << debugString(c) << " \"" << v << "\" is not parseable as integer value "
56  << "or exceeds the limits of the selected type " << d->type;
57  result.errorMessage = validationError(c);
58  }
59  } else {
60  defaultValue(c, &result);
61  }
62 
63  return result;
64 }
65 
67 {
68  cb(validate(c, params));
69 }
70 
72 {
73  Q_UNUSED(errorData)
74  Q_D(const ValidatorInteger);
75  const QString _label = label(c);
76  QString min;
77  QString max;
78  switch (d->type) {
79  case QMetaType::Char:
80  min = c->locale().toString(std::numeric_limits<char>::min());
81  max = c->locale().toString(std::numeric_limits<char>::max());
82  break;
83  case QMetaType::Short:
84  min = c->locale().toString(std::numeric_limits<short>::min());
85  max = c->locale().toString(std::numeric_limits<short>::max());
86  break;
87  case QMetaType::Int:
88  min = c->locale().toString(std::numeric_limits<int>::min());
89  max = c->locale().toString(std::numeric_limits<int>::max());
90  break;
91  case QMetaType::Long:
92  min = c->locale().toString(static_cast<qlonglong>(std::numeric_limits<long>::min()));
93  max = c->locale().toString(static_cast<qlonglong>(std::numeric_limits<long>::max()));
94  break;
96  min = c->locale().toString(std::numeric_limits<qlonglong>::min());
97  max = c->locale().toString(std::numeric_limits<qlonglong>::max());
98  break;
99  case QMetaType::UChar:
100  min = c->locale().toString(std::numeric_limits<uchar>::min());
101  max = c->locale().toString(std::numeric_limits<uchar>::max());
102  break;
103  case QMetaType::UShort:
104  min = c->locale().toString(std::numeric_limits<ushort>::min());
105  max = c->locale().toString(std::numeric_limits<ushort>::max());
106  break;
107  case QMetaType::UInt:
108  min = c->locale().toString(std::numeric_limits<uint>::min());
109  max = c->locale().toString(std::numeric_limits<uint>::max());
110  break;
111  case QMetaType::ULong:
112  min = c->locale().toString(static_cast<qulonglong>(std::numeric_limits<ulong>::min()));
113  max = c->locale().toString(static_cast<qulonglong>(std::numeric_limits<ulong>::max()));
114  break;
116  default:
117  min = c->locale().toString(std::numeric_limits<qulonglong>::min());
118  max = c->locale().toString(std::numeric_limits<qulonglong>::max());
119  break;
120  }
121  if (_label.isEmpty()) {
122  //: %1 is the minimum numerical limit for the selected type, %2 is the maximum numeric limit
123  //% "Not a valid integer value between %1 and %2."
124  return c->qtTrId("cutelyst-valinteger-genvalerr").arg(min, max);
125  } else {
126  //: %1 will be replaced by the field name, %2 is the minimum numerical limit for the
127  //: selected type, %3 is the maximum numeric limit
128  //% "The value in the “%1“ field is not a valid integer between %2 and %3."
129  return c->qtTrId("cutelyst-valinteger-genvalerr-label").arg(_label, min, max);
130  }
131 }
QString genericValidationError(Context *c, const QVariant &errorData=QVariant()) const override
Returns a generic error message if validation failed.
Stores custom error messages and the input field label.
QString toString(QDate date, FormatType format) const const
Checks if the value is an integer.
The Cutelyst Context.
Definition: context.h:42
void defaultValue(Context *c, ValidatorReturnType *result) const
bool isEmpty() const const
ValidatorReturnType validate(Context *c, const ParamsMultiMap &params) const override
The Cutelyst namespace holds all public Cutelyst API.
QString debugString(const Context *c) const
Base class for all validator rules.
QLocale locale() const noexcept
Definition: context.cpp:461
QString value(const ParamsMultiMap &params) const
QString label(const Context *c) const
std::function< void(ValidatorReturnType &&result)> ValidatorRtFn
Void callback function for validator rules that processes the ValidatorReturnType.
Definition: validatorrule.h:82
QString validationError(Context *c, const QVariant &errorData={}) const
QString validationDataError(Context *c, const QVariant &errorData={}) const
QString qtTrId(const char *id, int n=-1) const
Definition: context.h:658
bool isValid() const const
Contains the result of a single input parameter validation.
Definition: validatorrule.h:52
void validateCb(Context *c, const ParamsMultiMap &params, ValidatorRtFn cb) const override
QString arg(Args &&... args) const const
ValidatorInteger(const QString &field, QMetaType::Type type=QMetaType::ULongLong, const ValidatorMessages &messages={}, const QString &defValKey={})