1e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Tencent is pleased to support the open source community by making RapidJSON available. 2e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 3e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. 4e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 5e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Licensed under the MIT License (the "License"); you may not use this file except 6e462795ff5d4c7359f9e8637c10544bb2de70107tturney// in compliance with the License. You may obtain a copy of the License at 7e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 8e462795ff5d4c7359f9e8637c10544bb2de70107tturney// http://opensource.org/licenses/MIT 9e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 10e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Unless required by applicable law or agreed to in writing, software distributed 11e462795ff5d4c7359f9e8637c10544bb2de70107tturney// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 12e462795ff5d4c7359f9e8637c10544bb2de70107tturney// CONDITIONS OF ANY KIND, either express or implied. See the License for the 13e462795ff5d4c7359f9e8637c10544bb2de70107tturney// specific language governing permissions and limitations under the License. 14e462795ff5d4c7359f9e8637c10544bb2de70107tturney 15e462795ff5d4c7359f9e8637c10544bb2de70107tturney#ifndef RAPIDJSON_ERROR_ERROR_H__ 16e462795ff5d4c7359f9e8637c10544bb2de70107tturney#define RAPIDJSON_ERROR_ERROR_H__ 17e462795ff5d4c7359f9e8637c10544bb2de70107tturney 18e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include "../rapidjson.h" 19e462795ff5d4c7359f9e8637c10544bb2de70107tturney 20e462795ff5d4c7359f9e8637c10544bb2de70107tturney/*! \file error.h */ 21e462795ff5d4c7359f9e8637c10544bb2de70107tturney 22e462795ff5d4c7359f9e8637c10544bb2de70107tturney/*! \defgroup RAPIDJSON_ERRORS RapidJSON error handling */ 23e462795ff5d4c7359f9e8637c10544bb2de70107tturney 24e462795ff5d4c7359f9e8637c10544bb2de70107tturney/////////////////////////////////////////////////////////////////////////////// 25e462795ff5d4c7359f9e8637c10544bb2de70107tturney// RAPIDJSON_ERROR_CHARTYPE 26e462795ff5d4c7359f9e8637c10544bb2de70107tturney 27e462795ff5d4c7359f9e8637c10544bb2de70107tturney//! Character type of error messages. 28e462795ff5d4c7359f9e8637c10544bb2de70107tturney/*! \ingroup RAPIDJSON_ERRORS 29e462795ff5d4c7359f9e8637c10544bb2de70107tturney The default character type is \c char. 30e462795ff5d4c7359f9e8637c10544bb2de70107tturney On Windows, user can define this macro as \c TCHAR for supporting both 31e462795ff5d4c7359f9e8637c10544bb2de70107tturney unicode/non-unicode settings. 32e462795ff5d4c7359f9e8637c10544bb2de70107tturney*/ 33e462795ff5d4c7359f9e8637c10544bb2de70107tturney#ifndef RAPIDJSON_ERROR_CHARTYPE 34e462795ff5d4c7359f9e8637c10544bb2de70107tturney#define RAPIDJSON_ERROR_CHARTYPE char 35e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif 36e462795ff5d4c7359f9e8637c10544bb2de70107tturney 37e462795ff5d4c7359f9e8637c10544bb2de70107tturney/////////////////////////////////////////////////////////////////////////////// 38e462795ff5d4c7359f9e8637c10544bb2de70107tturney// RAPIDJSON_ERROR_STRING 39e462795ff5d4c7359f9e8637c10544bb2de70107tturney 40e462795ff5d4c7359f9e8637c10544bb2de70107tturney//! Macro for converting string literial to \ref RAPIDJSON_ERROR_CHARTYPE[]. 41e462795ff5d4c7359f9e8637c10544bb2de70107tturney/*! \ingroup RAPIDJSON_ERRORS 42e462795ff5d4c7359f9e8637c10544bb2de70107tturney By default this conversion macro does nothing. 43e462795ff5d4c7359f9e8637c10544bb2de70107tturney On Windows, user can define this macro as \c _T(x) for supporting both 44e462795ff5d4c7359f9e8637c10544bb2de70107tturney unicode/non-unicode settings. 45e462795ff5d4c7359f9e8637c10544bb2de70107tturney*/ 46e462795ff5d4c7359f9e8637c10544bb2de70107tturney#ifndef RAPIDJSON_ERROR_STRING 47e462795ff5d4c7359f9e8637c10544bb2de70107tturney#define RAPIDJSON_ERROR_STRING(x) x 48e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif 49e462795ff5d4c7359f9e8637c10544bb2de70107tturney 50e462795ff5d4c7359f9e8637c10544bb2de70107tturneyRAPIDJSON_NAMESPACE_BEGIN 51e462795ff5d4c7359f9e8637c10544bb2de70107tturney 52e462795ff5d4c7359f9e8637c10544bb2de70107tturney/////////////////////////////////////////////////////////////////////////////// 53e462795ff5d4c7359f9e8637c10544bb2de70107tturney// ParseErrorCode 54e462795ff5d4c7359f9e8637c10544bb2de70107tturney 55e462795ff5d4c7359f9e8637c10544bb2de70107tturney//! Error code of parsing. 56e462795ff5d4c7359f9e8637c10544bb2de70107tturney/*! \ingroup RAPIDJSON_ERRORS 57e462795ff5d4c7359f9e8637c10544bb2de70107tturney \see GenericReader::Parse, GenericReader::GetParseErrorCode 58e462795ff5d4c7359f9e8637c10544bb2de70107tturney*/ 59e462795ff5d4c7359f9e8637c10544bb2de70107tturneyenum ParseErrorCode { 60e462795ff5d4c7359f9e8637c10544bb2de70107tturney kParseErrorNone = 0, //!< No error. 61e462795ff5d4c7359f9e8637c10544bb2de70107tturney 62e462795ff5d4c7359f9e8637c10544bb2de70107tturney kParseErrorDocumentEmpty, //!< The document is empty. 63e462795ff5d4c7359f9e8637c10544bb2de70107tturney kParseErrorDocumentRootNotSingular, //!< The document root must not follow by other values. 64e462795ff5d4c7359f9e8637c10544bb2de70107tturney 65e462795ff5d4c7359f9e8637c10544bb2de70107tturney kParseErrorValueInvalid, //!< Invalid value. 66e462795ff5d4c7359f9e8637c10544bb2de70107tturney 67e462795ff5d4c7359f9e8637c10544bb2de70107tturney kParseErrorObjectMissName, //!< Missing a name for object member. 68e462795ff5d4c7359f9e8637c10544bb2de70107tturney kParseErrorObjectMissColon, //!< Missing a colon after a name of object member. 69e462795ff5d4c7359f9e8637c10544bb2de70107tturney kParseErrorObjectMissCommaOrCurlyBracket, //!< Missing a comma or '}' after an object member. 70e462795ff5d4c7359f9e8637c10544bb2de70107tturney 71e462795ff5d4c7359f9e8637c10544bb2de70107tturney kParseErrorArrayMissCommaOrSquareBracket, //!< Missing a comma or ']' after an array element. 72e462795ff5d4c7359f9e8637c10544bb2de70107tturney 73e462795ff5d4c7359f9e8637c10544bb2de70107tturney kParseErrorStringUnicodeEscapeInvalidHex, //!< Incorrect hex digit after \\u escape in string. 74e462795ff5d4c7359f9e8637c10544bb2de70107tturney kParseErrorStringUnicodeSurrogateInvalid, //!< The surrogate pair in string is invalid. 75e462795ff5d4c7359f9e8637c10544bb2de70107tturney kParseErrorStringEscapeInvalid, //!< Invalid escape character in string. 76e462795ff5d4c7359f9e8637c10544bb2de70107tturney kParseErrorStringMissQuotationMark, //!< Missing a closing quotation mark in string. 77e462795ff5d4c7359f9e8637c10544bb2de70107tturney kParseErrorStringInvalidEncoding, //!< Invalid encoding in string. 78e462795ff5d4c7359f9e8637c10544bb2de70107tturney 79e462795ff5d4c7359f9e8637c10544bb2de70107tturney kParseErrorNumberTooBig, //!< Number too big to be stored in double. 80e462795ff5d4c7359f9e8637c10544bb2de70107tturney kParseErrorNumberMissFraction, //!< Miss fraction part in number. 81e462795ff5d4c7359f9e8637c10544bb2de70107tturney kParseErrorNumberMissExponent, //!< Miss exponent in number. 82e462795ff5d4c7359f9e8637c10544bb2de70107tturney 83e462795ff5d4c7359f9e8637c10544bb2de70107tturney kParseErrorTermination, //!< Parsing was terminated. 84e462795ff5d4c7359f9e8637c10544bb2de70107tturney kParseErrorUnspecificSyntaxError //!< Unspecific syntax error. 85e462795ff5d4c7359f9e8637c10544bb2de70107tturney}; 86e462795ff5d4c7359f9e8637c10544bb2de70107tturney 87e462795ff5d4c7359f9e8637c10544bb2de70107tturney//! Result of parsing (wraps ParseErrorCode) 88e462795ff5d4c7359f9e8637c10544bb2de70107tturney/*! 89e462795ff5d4c7359f9e8637c10544bb2de70107tturney \ingroup RAPIDJSON_ERRORS 90e462795ff5d4c7359f9e8637c10544bb2de70107tturney \code 91e462795ff5d4c7359f9e8637c10544bb2de70107tturney Document doc; 92e462795ff5d4c7359f9e8637c10544bb2de70107tturney ParseResult ok = doc.Parse("[42]"); 93e462795ff5d4c7359f9e8637c10544bb2de70107tturney if (!ok) { 94e462795ff5d4c7359f9e8637c10544bb2de70107tturney fprintf(stderr, "JSON parse error: %s (%u)", 95e462795ff5d4c7359f9e8637c10544bb2de70107tturney GetParseError_En(ok.Code()), ok.Offset()); 96e462795ff5d4c7359f9e8637c10544bb2de70107tturney exit(EXIT_FAILURE); 97e462795ff5d4c7359f9e8637c10544bb2de70107tturney } 98e462795ff5d4c7359f9e8637c10544bb2de70107tturney \endcode 99e462795ff5d4c7359f9e8637c10544bb2de70107tturney \see GenericReader::Parse, GenericDocument::Parse 100e462795ff5d4c7359f9e8637c10544bb2de70107tturney*/ 101e462795ff5d4c7359f9e8637c10544bb2de70107tturneystruct ParseResult { 102e462795ff5d4c7359f9e8637c10544bb2de70107tturney 103e462795ff5d4c7359f9e8637c10544bb2de70107tturney //! Default constructor, no error. 104e462795ff5d4c7359f9e8637c10544bb2de70107tturney ParseResult() : code_(kParseErrorNone), offset_(0) {} 105e462795ff5d4c7359f9e8637c10544bb2de70107tturney //! Constructor to set an error. 106e462795ff5d4c7359f9e8637c10544bb2de70107tturney ParseResult(ParseErrorCode code, size_t offset) : code_(code), offset_(offset) {} 107e462795ff5d4c7359f9e8637c10544bb2de70107tturney 108e462795ff5d4c7359f9e8637c10544bb2de70107tturney //! Get the error code. 109e462795ff5d4c7359f9e8637c10544bb2de70107tturney ParseErrorCode Code() const { return code_; } 110e462795ff5d4c7359f9e8637c10544bb2de70107tturney //! Get the error offset, if \ref IsError(), 0 otherwise. 111e462795ff5d4c7359f9e8637c10544bb2de70107tturney size_t Offset() const { return offset_; } 112e462795ff5d4c7359f9e8637c10544bb2de70107tturney 113e462795ff5d4c7359f9e8637c10544bb2de70107tturney //! Conversion to \c bool, returns \c true, iff !\ref IsError(). 114e462795ff5d4c7359f9e8637c10544bb2de70107tturney operator bool() const { return !IsError(); } 115e462795ff5d4c7359f9e8637c10544bb2de70107tturney //! Whether the result is an error. 116e462795ff5d4c7359f9e8637c10544bb2de70107tturney bool IsError() const { return code_ != kParseErrorNone; } 117e462795ff5d4c7359f9e8637c10544bb2de70107tturney 118e462795ff5d4c7359f9e8637c10544bb2de70107tturney bool operator==(const ParseResult& that) const { return code_ == that.code_; } 119e462795ff5d4c7359f9e8637c10544bb2de70107tturney bool operator==(ParseErrorCode code) const { return code_ == code; } 120e462795ff5d4c7359f9e8637c10544bb2de70107tturney friend bool operator==(ParseErrorCode code, const ParseResult & err) { return code == err.code_; } 121e462795ff5d4c7359f9e8637c10544bb2de70107tturney 122e462795ff5d4c7359f9e8637c10544bb2de70107tturney //! Reset error code. 123e462795ff5d4c7359f9e8637c10544bb2de70107tturney void Clear() { Set(kParseErrorNone); } 124e462795ff5d4c7359f9e8637c10544bb2de70107tturney //! Update error code and offset. 125e462795ff5d4c7359f9e8637c10544bb2de70107tturney void Set(ParseErrorCode code, size_t offset = 0) { code_ = code; offset_ = offset; } 126e462795ff5d4c7359f9e8637c10544bb2de70107tturney 127e462795ff5d4c7359f9e8637c10544bb2de70107tturneyprivate: 128e462795ff5d4c7359f9e8637c10544bb2de70107tturney ParseErrorCode code_; 129e462795ff5d4c7359f9e8637c10544bb2de70107tturney size_t offset_; 130e462795ff5d4c7359f9e8637c10544bb2de70107tturney}; 131e462795ff5d4c7359f9e8637c10544bb2de70107tturney 132e462795ff5d4c7359f9e8637c10544bb2de70107tturney//! Function pointer type of GetParseError(). 133e462795ff5d4c7359f9e8637c10544bb2de70107tturney/*! \ingroup RAPIDJSON_ERRORS 134e462795ff5d4c7359f9e8637c10544bb2de70107tturney 135e462795ff5d4c7359f9e8637c10544bb2de70107tturney This is the prototype for \c GetParseError_X(), where \c X is a locale. 136e462795ff5d4c7359f9e8637c10544bb2de70107tturney User can dynamically change locale in runtime, e.g.: 137e462795ff5d4c7359f9e8637c10544bb2de70107tturney\code 138e462795ff5d4c7359f9e8637c10544bb2de70107tturney GetParseErrorFunc GetParseError = GetParseError_En; // or whatever 139e462795ff5d4c7359f9e8637c10544bb2de70107tturney const RAPIDJSON_ERROR_CHARTYPE* s = GetParseError(document.GetParseErrorCode()); 140e462795ff5d4c7359f9e8637c10544bb2de70107tturney\endcode 141e462795ff5d4c7359f9e8637c10544bb2de70107tturney*/ 142e462795ff5d4c7359f9e8637c10544bb2de70107tturneytypedef const RAPIDJSON_ERROR_CHARTYPE* (*GetParseErrorFunc)(ParseErrorCode); 143e462795ff5d4c7359f9e8637c10544bb2de70107tturney 144e462795ff5d4c7359f9e8637c10544bb2de70107tturneyRAPIDJSON_NAMESPACE_END 145e462795ff5d4c7359f9e8637c10544bb2de70107tturney 146e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif // RAPIDJSON_ERROR_ERROR_H__ 147