Browse Source

add size contraints to Data validator

Kolja Strohm 1 month ago
parent
commit
960fce915c
3 changed files with 50 additions and 2 deletions
  1. 1 1
      CharMap.h
  2. 30 1
      DataValidator.cpp
  3. 19 0
      DataValidator.h

+ 1 - 1
CharMap.h

@@ -118,7 +118,7 @@ namespace Framework
             return value ? dynamic_cast<V*>(value->getThis()) : 0;
         }
 
-        V* zValue()
+        V* zValue() const
         {
             return value;
         }

+ 30 - 1
DataValidator.cpp

@@ -1043,6 +1043,24 @@ ValidationResult* DataValidator::validate(ElementPath* pathToValidate,
                 }
             }
             const AbstractArray* array = zValue->asAbstractArray();
+            if (zConstraints->hasAttribute("minSize")
+                && (int)zConstraints->getAttributeValue("minSize")
+                       > array->getLength())
+            {
+                return new TypeMissmatch(path,
+                    dynamic_cast<AbstractElement*>(zValue->getThis()),
+                    dynamic_cast<XML::Element*>(zConstraints->getThis()),
+                    0);
+            }
+            if (zConstraints->hasAttribute("maxSize")
+                && (int)zConstraints->getAttributeValue("maxSize")
+                       < array->getLength())
+            {
+                return new TypeMissmatch(path,
+                    dynamic_cast<AbstractElement*>(zValue->getThis()),
+                    dynamic_cast<XML::Element*>(zConstraints->getThis()),
+                    0);
+            }
             for (int i = 0; i < array->getLength(); i++)
             {
                 Text p = path;
@@ -1058,7 +1076,6 @@ ValidationResult* DataValidator::validate(ElementPath* pathToValidate,
                         dynamic_cast<XML::Element*>(zConstraints->getThis()),
                         res);
                 }
-                res->release();
             }
         }
         break;
@@ -1503,6 +1520,18 @@ JSON::JSONObject* Framework::Validator::DataValidator::getJsonSchema(
         {
             oneOf->addValue(getJsonSchema(e, zDefs));
         }
+        if (zConstraint->hasAttribute("minSize"))
+        {
+            result->addValue("minItems",
+                new JSON::JSONNumber(
+                    (double)zConstraint->getAttributeValue("minSize")));
+        }
+        if (zConstraint->hasAttribute("maxSize"))
+        {
+            result->addValue("maxItems",
+                new JSON::JSONNumber(
+                    (double)zConstraint->getAttributeValue("maxSize")));
+        }
         items->addValue("oneOf", oneOf);
         result->addValue("items", items);
     }

+ 19 - 0
DataValidator.h

@@ -854,6 +854,25 @@ namespace Framework
                 return this;
             }
 
+            ArrayValidationBuilder<T>* withMinSize(int size)
+            {
+                element.setAttribute("minSize", Text(size));
+                return this;
+            }
+
+            ArrayValidationBuilder<T>* withMaxSize(int size)
+            {
+                element.setAttribute("maxSize", Text(size));
+                return this;
+            }
+
+            ArrayValidationBuilder<T>* withRequiredSize(int size)
+            {
+                element.setAttribute("minSize", Text(size));
+                element.setAttribute("maxSize", Text(size));
+                return this;
+            }
+
             T* finishArray()
             {
                 T* result = builder(element);