@@ -38,6 +38,25 @@ AbstractParameterEditor* ParameterDelegate::createEditor(QSize targetBounds)
38
38
return m_editorCreator (sharedFromThis (), targetBounds);
39
39
}
40
40
41
+ bool ParameterDelegate::jsonTypeCompatible (QJsonValue::Type jsonType, ParameterDelegate::ParameterType type) {
42
+ if (jsonType == QJsonValue::Double) {
43
+ return (type == ParameterType::Decimal) || (type == ParameterType::Integer);
44
+ }
45
+ else if (jsonType == QJsonValue::String) {
46
+ return type == ParameterType::String;
47
+ }
48
+ else if (jsonType == QJsonValue::Bool) {
49
+ return type == ParameterType::Boolean ;
50
+ }
51
+ else if (jsonType == QJsonValue::Array) {
52
+ return type == ParameterType::Array;
53
+ }
54
+ else if (jsonType == QJsonValue::Object) {
55
+ return type == ParameterType::Object;
56
+ }
57
+ return false ;
58
+ }
59
+
41
60
QList<ParameterDelegate::ParameterInfo> ParameterDelegate::parameterInfos () const
42
61
{
43
62
return m_parameterMap.values ();
@@ -48,66 +67,81 @@ ParameterDelegate::ParameterInfo ParameterDelegate::getInfo(QString name) const
48
67
return m_parameterMap.value (name);
49
68
}
50
69
51
- bool ParameterDelegate::validate (const QJsonObject ¶meters) const
70
+ QStringList ParameterDelegate::validate (const QJsonObject ¶meters) const
52
71
{
53
72
return validateAgainstInfos (parameters, parameterInfos ());
54
73
}
55
74
56
75
QString ParameterDelegate::actionDescription (const QJsonObject ¶meters) const
57
76
{
58
- if (!validate (parameters)) {
77
+ if (!validate (parameters). isEmpty () ) {
59
78
return QString ();
60
79
}
61
80
62
81
return m_actionDescriber (parameters);
63
82
}
64
83
65
- bool ParameterDelegate::validateAgainstInfos (const QJsonObject ¶meters, QList<ParameterDelegate::ParameterInfo> infos)
84
+ QStringList ParameterDelegate::validateAgainstInfos (const QJsonObject ¶meters, QList<ParameterDelegate::ParameterInfo> infos)
66
85
{
67
- if (infos.isEmpty ()) {
68
- return true ;
69
- }
86
+ QStringList invalidations;
70
87
71
88
for (auto param : infos) {
72
89
if (!parameters.contains (param.name )) {
73
90
if (!param.optional ) {
74
- return false ;
91
+ invalidations.append (QString (" Missing required parameter '%1'." ).arg (param.name ));
92
+ continue ;
75
93
}
76
94
}
77
- else if (param.type != parameters.value (param.name ).type ()) {
78
- return false ;
95
+ else if (!jsonTypeCompatible (parameters.value (param.name ).type (), param.type )) {
96
+ invalidations.append (QString (" Value of provided parameter '%1' is wrong type." ).arg (param.name ));
97
+ continue ;
79
98
}
80
99
81
- if (param.type == QJsonValue ::Array) {
100
+ if (param.type == ParameterType ::Array) {
82
101
QJsonArray array = parameters.value (param.name ).toArray ();
83
102
if (array.isEmpty () && !param.optional ) {
84
- return false ;
103
+ invalidations.append (QString (" Required array parameter '%1' is empty." ).arg (param.name ));
104
+ continue ;
85
105
}
86
106
for (QJsonValueRef value: array) {
87
107
if (!value.isObject ()) {
88
- return false ;
108
+ invalidations. append ( QString ( " Array parameter '%1' has invalid value '%2'. " ). arg (param. name ). arg (value. toString ())) ;
89
109
}
90
- if (! validateAgainstInfos (value. toObject (), param. subInfos )) {
91
- return false ;
110
+ else {
111
+ invalidations. append ( validateAgainstInfos (value. toObject (), param. subInfos )) ;
92
112
}
93
113
}
94
114
}
95
- else if (param.type == QJsonValue ::Object) {
115
+ else if (param.type == ParameterType ::Object) {
96
116
QJsonValue val = parameters.value (param.name );
97
117
if (!val.isObject ()) {
98
- return false ;
118
+ invalidations.append (QString (" Object parameter '%1' is not an object." ).arg (param.name ));
119
+ }
120
+ else {
121
+ invalidations.append (validateAgainstInfos (val.toObject (), param.subInfos ));
99
122
}
100
- if (!validateAgainstInfos (val.toObject (), param.subInfos )) {
101
- return false ;
123
+ }
124
+ else if (!param.possibleValues .isEmpty ()) {
125
+ if (!param.possibleValues .contains (parameters.value (param.name ))) {
126
+ invalidations.append (QString (" Parameter '%1' has invalid value '%2'." ).arg (param.name ).arg (parameters.value (param.name ).toString ()));
102
127
}
103
128
}
104
- else if (param.type == QJsonValue::Double && param.hasIntLimits ) {
105
- int value = parameters.value (param.name ).toInt ();
106
- if (value > param.intMax || value < param.intMin ) {
107
- return false ;
129
+ else if (param.type == ParameterType::Integer || param.type == ParameterType::Decimal) {
130
+ if (!param.ranges .isEmpty ()) {
131
+ double value = parameters.value (param.name ).toDouble ();
132
+ bool within = false ;
133
+ for (auto range : param.ranges ) {
134
+ if (value >= range.first && value <= range.second ) {
135
+ within = true ;
136
+ break ;
137
+ }
138
+ }
139
+ if (!within) {
140
+ invalidations.append (QString (" Parameter '%1' value '%2' is outside valid range." ).arg (param.name ).arg (value));
141
+ }
108
142
}
109
143
}
110
144
}
111
145
112
- return true ;
146
+ return invalidations ;
113
147
}
0 commit comments