diff options
Diffstat (limited to 'src/components/smart_objects/include')
11 files changed, 134 insertions, 16 deletions
diff --git a/src/components/smart_objects/include/smart_objects/always_false_schema_item.h b/src/components/smart_objects/include/smart_objects/always_false_schema_item.h index dfbf4ba43e..6e62be6f2d 100644 --- a/src/components/smart_objects/include/smart_objects/always_false_schema_item.h +++ b/src/components/smart_objects/include/smart_objects/always_false_schema_item.h @@ -53,7 +53,8 @@ class CAlwaysFalseSchemaItem : public ISchemaItem { * @param Object Object to validate. * @return Errors::ERROR **/ - Errors::eType validate(const SmartObject& Object) OVERRIDE; + Errors::eType validate(const SmartObject& Object, + std::string& errorMessage) OVERRIDE; private: CAlwaysFalseSchemaItem(); diff --git a/src/components/smart_objects/include/smart_objects/always_true_schema_item.h b/src/components/smart_objects/include/smart_objects/always_true_schema_item.h index 3dd598d7bd..54e8bc9baa 100644 --- a/src/components/smart_objects/include/smart_objects/always_true_schema_item.h +++ b/src/components/smart_objects/include/smart_objects/always_true_schema_item.h @@ -53,7 +53,8 @@ class CAlwaysTrueSchemaItem : public ISchemaItem { * @param Object Object to validate. * @return NsSmartObjects::Errors::eType **/ - Errors::eType validate(const SmartObject& Object) OVERRIDE; + Errors::eType validate(const SmartObject& Object, + std::string& errorMessage) OVERRIDE; private: CAlwaysTrueSchemaItem(); diff --git a/src/components/smart_objects/include/smart_objects/array_schema_item.h b/src/components/smart_objects/include/smart_objects/array_schema_item.h index 0d3a651d56..c8057d6ca1 100644 --- a/src/components/smart_objects/include/smart_objects/array_schema_item.h +++ b/src/components/smart_objects/include/smart_objects/array_schema_item.h @@ -69,7 +69,8 @@ class CArraySchemaItem : public ISchemaItem { * * @return NsSmartObjects::Errors::eType **/ - Errors::eType validate(const SmartObject& Object) OVERRIDE; + Errors::eType validate(const SmartObject& Object, + std::string& errorMessage) OVERRIDE; /** * @brief Apply schema. diff --git a/src/components/smart_objects/include/smart_objects/default_shema_item.h b/src/components/smart_objects/include/smart_objects/default_shema_item.h index 857354a4e6..6bac513b16 100644 --- a/src/components/smart_objects/include/smart_objects/default_shema_item.h +++ b/src/components/smart_objects/include/smart_objects/default_shema_item.h @@ -54,7 +54,8 @@ class CDefaultSchemaItem : public ISchemaItem { * @param Object Object to validate. * @return NsSmartObjects::Errors::eType **/ - Errors::eType validate(const SmartObject& Object) OVERRIDE; + Errors::eType validate(const SmartObject& Object, + std::string& errorMessage) OVERRIDE; /** * @brief Set default value to an object. @@ -98,9 +99,20 @@ CDefaultSchemaItem<Type>::CDefaultSchemaItem(const ParameterType& DefaultValue) : mDefaultValue(DefaultValue) {} template <typename Type> -Errors::eType CDefaultSchemaItem<Type>::validate(const SmartObject& Object) { - return (getSmartType() == Object.getType()) ? Errors::OK - : Errors::INVALID_VALUE; +Errors::eType CDefaultSchemaItem<Type>::validate(const SmartObject& Object, + std::string& errorMessage) { + if (getSmartType() != Object.getType()) { + if (!Object.getKey().empty()) { + errorMessage.assign("Validation failed for \"" + Object.getKey() + + "\". "); + } + errorMessage += "Incorrect type, expected: " + + SmartObject::typeToString(getSmartType()) + ", got: " + + SmartObject::typeToString(Object.getType()); + return Errors::INVALID_VALUE; + } else { + return Errors::OK; + } } template <typename Type> diff --git a/src/components/smart_objects/include/smart_objects/enum_schema_item.h b/src/components/smart_objects/include/smart_objects/enum_schema_item.h index a0d6d94017..6f77856c45 100644 --- a/src/components/smart_objects/include/smart_objects/enum_schema_item.h +++ b/src/components/smart_objects/include/smart_objects/enum_schema_item.h @@ -69,7 +69,8 @@ class TEnumSchemaItem : public CDefaultSchemaItem<EnumType> { * @param Object Object to validate. * @return NsSmartObjects::Errors::eType **/ - Errors::eType validate(const SmartObject& Object) OVERRIDE; + Errors::eType validate(const SmartObject& Object, + std::string& errorMessage) OVERRIDE; /** * @brief Apply schema. * This implementation checks if enumeration is represented as string @@ -206,12 +207,33 @@ utils::SharedPtr<TEnumSchemaItem<EnumType> > TEnumSchemaItem<EnumType>::create( } template <typename EnumType> -Errors::eType TEnumSchemaItem<EnumType>::validate(const SmartObject& Object) { +Errors::eType TEnumSchemaItem<EnumType>::validate(const SmartObject& Object, + std::string& errorMessage) { if (SmartType_Integer != Object.getType()) { + if (!Object.getKey().empty()) { + errorMessage.assign("Validation failed for \"" + Object.getKey() + + "\". "); + } + + if (SmartType_String == Object.getType()) { + errorMessage += "Invalid enum value: " + Object.asString(); + } else { + errorMessage += "Incorrect type, expected: " + + SmartObject::typeToString(SmartType_Integer) + + " (enum), got: " + + SmartObject::typeToString(Object.getType()); + } return Errors::INVALID_VALUE; } if (mAllowedElements.find(static_cast<EnumType>(Object.asInt())) == mAllowedElements.end()) { + if (!Object.getKey().empty()) { + errorMessage.assign("Validation failed for \"" + Object.getKey() + + "\". "); + } + std::stringstream stream; + stream << "Invalid enum value: " << Object.asInt(); + errorMessage += stream.str(); return Errors::OUT_OF_RANGE; } return Errors::OK; diff --git a/src/components/smart_objects/include/smart_objects/number_schema_item.h b/src/components/smart_objects/include/smart_objects/number_schema_item.h index 01d6c08daa..70e75938ed 100644 --- a/src/components/smart_objects/include/smart_objects/number_schema_item.h +++ b/src/components/smart_objects/include/smart_objects/number_schema_item.h @@ -69,7 +69,8 @@ class TNumberSchemaItem : public CDefaultSchemaItem<NumberType> { * @param Object Object to validate. * @return NsSmartObjects::Errors::eType **/ - Errors::eType validate(const SmartObject& Object) OVERRIDE; + Errors::eType validate(const SmartObject& Object, + std::string& errorMessage) OVERRIDE; private: /** @@ -127,8 +128,18 @@ bool TNumberSchemaItem<NumberType>::isValidNumberType(SmartType type) { template <typename NumberType> Errors::eType TNumberSchemaItem<NumberType>::validate( - const SmartObject& Object) { + const SmartObject& Object, std::string& errorMessage) { if (!isValidNumberType(Object.getType())) { + if (!Object.getKey().empty()) { + errorMessage.assign("Validation failed for \"" + Object.getKey() + + "\". "); + } + SmartType expectedType = (typeid(double) == typeid(Object.getType())) + ? SmartType_Double + : SmartType_Integer; + errorMessage += "Incorrect type, expected: " + + SmartObject::typeToString(expectedType) + ", got: " + + SmartObject::typeToString(Object.getType()); return Errors::INVALID_VALUE; } NumberType value(0); @@ -148,10 +159,26 @@ Errors::eType TNumberSchemaItem<NumberType>::validate( NumberType rangeLimit; if (mMinValue.getValue(rangeLimit) && (value < rangeLimit)) { + if (!Object.getKey().empty()) { + errorMessage.assign("Validation failed for \"" + Object.getKey() + + "\". "); + } + std::stringstream stream; + stream << "Value too small, got: " << value + << ", minimum allowed: " << rangeLimit; + errorMessage += stream.str(); return Errors::OUT_OF_RANGE; } if (mMaxValue.getValue(rangeLimit) && (value > rangeLimit)) { + if (!Object.getKey().empty()) { + errorMessage.assign("Validation failed for \"" + Object.getKey() + + "\". "); + } + std::stringstream stream; + stream << "Value too large, got: " << value + << ", maximum allowed: " << rangeLimit; + errorMessage += stream.str(); return Errors::OUT_OF_RANGE; } return Errors::OK; diff --git a/src/components/smart_objects/include/smart_objects/object_schema_item.h b/src/components/smart_objects/include/smart_objects/object_schema_item.h index 549166e723..781f6a729c 100644 --- a/src/components/smart_objects/include/smart_objects/object_schema_item.h +++ b/src/components/smart_objects/include/smart_objects/object_schema_item.h @@ -88,7 +88,8 @@ class CObjectSchemaItem : public ISchemaItem { * @param Object Object to validate. * @return NsSmartObjects::Errors::eType **/ - Errors::eType validate(const SmartObject& Object) OVERRIDE; + Errors::eType validate(const SmartObject& Object, + std::string& errorMessage) OVERRIDE; /** * @brief Apply schema. * @param Object Object to apply schema. diff --git a/src/components/smart_objects/include/smart_objects/schema_item.h b/src/components/smart_objects/include/smart_objects/schema_item.h index 08610f244e..c1737417db 100644 --- a/src/components/smart_objects/include/smart_objects/schema_item.h +++ b/src/components/smart_objects/include/smart_objects/schema_item.h @@ -53,7 +53,8 @@ class ISchemaItem { * * @return NsSmartObjects::Errors::eType **/ - virtual Errors::eType validate(const SmartObject& Object); + virtual Errors::eType validate(const SmartObject& Object, + std::string& errorMessage); /** * @brief Set default value to an object. diff --git a/src/components/smart_objects/include/smart_objects/smart_object.h b/src/components/smart_objects/include/smart_objects/smart_object.h index 98e58fffd1..95d52209f7 100644 --- a/src/components/smart_objects/include/smart_objects/smart_object.h +++ b/src/components/smart_objects/include/smart_objects/smart_object.h @@ -674,7 +674,7 @@ class SmartObject FINAL { * * @return Result of validation. */ - Errors::eType validate(); + Errors::eType validate(std::string& errorMessage); /** * @brief Sets new schema @@ -699,6 +699,21 @@ class SmartObject FINAL { SmartType getType() const; /** + * @brief Sets new key for this object + * + * @param std::string New key sequesnce + * @return void + **/ + void setKey(const std::string& NewKey); + + /** + * @brief Returns current object type + * + * @return std::string + **/ + std::string getKey() const; + + /** * @brief Returns length of object * * If object has type string, array or map then method returns corresponded @@ -727,6 +742,35 @@ class SmartObject FINAL { return !(*this == Other); } + static std::string typeToString(SmartType type) { + switch (type) { + case SmartType_Null: + return "Null"; + case SmartType_Boolean: + return "Boolean"; + case SmartType_Integer: + return "Integer"; + case SmartType_Character: + return "Character"; + case SmartType_String: + return "String"; + case SmartType_Double: + return "Double"; + case SmartType_Map: + return "Object"; + case SmartType_Array: + return "Array"; + case SmartType_Binary: + return "Binary_Data"; + case SmartType_UInteger: + return "Unsigned_Integer"; + case SmartType_Invalid: + return "Invalid_Type"; + default: + return "Unknown_Type"; + } + } + protected: static std::string OperatorToTransform(const SmartMap::value_type& pair); /** @@ -976,6 +1020,12 @@ class SmartObject FINAL { * @brief Validation schema, attached to the object **/ CSmartSchema m_schema; + + /** + * @brief Key sequence that describes where the current object is within an + *object structure, for debugging purposes + **/ + std::string* m_key; }; /** diff --git a/src/components/smart_objects/include/smart_objects/smart_schema.h b/src/components/smart_objects/include/smart_objects/smart_schema.h index 52dfa12004..3fd67053ae 100644 --- a/src/components/smart_objects/include/smart_objects/smart_schema.h +++ b/src/components/smart_objects/include/smart_objects/smart_schema.h @@ -67,7 +67,8 @@ class CSmartSchema FINAL { * * @return Result of validation. */ - Errors::eType validate(const SmartObject& Object) const; + Errors::eType validate(const SmartObject& Object, + std::string& errorMessage) const; /** * @brief Set new root schema item. diff --git a/src/components/smart_objects/include/smart_objects/string_schema_item.h b/src/components/smart_objects/include/smart_objects/string_schema_item.h index 7fad8491a5..20d8040e29 100644 --- a/src/components/smart_objects/include/smart_objects/string_schema_item.h +++ b/src/components/smart_objects/include/smart_objects/string_schema_item.h @@ -66,7 +66,8 @@ class CStringSchemaItem : public CDefaultSchemaItem<std::string> { * @param Object Object to validate. * @return NsSmartObjects::Errors::eType **/ - Errors::eType validate(const SmartObject& Object) OVERRIDE; + Errors::eType validate(const SmartObject& Object, + std::string& errorMessage) OVERRIDE; private: /** |