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