reflective-rapidjson/lib/json/errorformatting.h

79 lines
2.6 KiB
C++

#ifndef REFLECTIVE_RAPIDJSON_JSON_ERROR_FORMATTING_H
#define REFLECTIVE_RAPIDJSON_JSON_ERROR_FORMATTING_H
/*!
* \file errorformatting.h
* \brief Contains helper functions to format errors when deserializing JSON files.
*/
#include "./errorhandling.h"
#include <c++utilities/conversion/stringbuilder.h>
#include <string_view>
namespace ReflectiveRapidJSON {
inline std::string_view jsonTypeToString(JsonType jsonType)
{
switch (jsonType) {
case ReflectiveRapidJSON::JsonType::Null:
return "null";
case ReflectiveRapidJSON::JsonType::Number:
return "number";
case ReflectiveRapidJSON::JsonType::Bool:
return "bool";
case ReflectiveRapidJSON::JsonType::String:
return "string";
case ReflectiveRapidJSON::JsonType::Array:
return "array";
case ReflectiveRapidJSON::JsonType::Object:
return "object";
default:
return "?";
}
}
inline std::string formatJsonDeserializationError(const JsonDeserializationError &error)
{
using namespace CppUtilities;
std::string_view errorKind;
std::string additionalInfo;
switch (error.kind) {
case JsonDeserializationErrorKind::TypeMismatch:
errorKind = "type mismatch";
additionalInfo = ": expected \"" % jsonTypeToString(error.expectedType) % "\", got \"" % jsonTypeToString(error.actualType) + '\"';
break;
case JsonDeserializationErrorKind::ArraySizeMismatch:
errorKind = "array size mismatch";
break;
case JsonDeserializationErrorKind::ConversionError:
errorKind = "conversion error";
break;
case JsonDeserializationErrorKind::UnexpectedDuplicate:
errorKind = "unexpected duplicate";
break;
case JsonDeserializationErrorKind::InvalidVariantObject:
errorKind = "invalid variant object";
break;
case JsonDeserializationErrorKind::InvalidVariantIndex:
errorKind = "invalid variant index";
break;
default:
errorKind = "semantic error";
}
if (error.record && error.member) {
return errorKind % " within record \"" % error.record % "\" and member \"" % error.member % '\"' + additionalInfo;
} else if (error.record && error.index != JsonDeserializationError::noIndex) {
return errorKind % " within record \"" % error.record % "\" and index \"" % error.index % '\"' + additionalInfo;
} else if (error.record) {
return errorKind % " within record \"" % error.record % '\"' + additionalInfo;
} else {
return errorKind % " in document" + additionalInfo;
}
}
} // namespace ReflectiveRapidJSON
#endif // REFLECTIVE_RAPIDJSON_JSON_ERROR_FORMATTING_H