1  
//
1  
//
2  
// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
2  
// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
3  
//
3  
//
4  
// Distributed under the Boost Software License, Version 1.0. (See accompanying
4  
// Distributed under the Boost Software License, Version 1.0. (See accompanying
5  
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5  
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6  
//
6  
//
7  
// Official repository: https://github.com/boostorg/json
7  
// Official repository: https://github.com/boostorg/json
8  
//
8  
//
9  

9  

10  
#ifndef BOOST_JSON_IMPL_ERROR_IPP
10  
#ifndef BOOST_JSON_IMPL_ERROR_IPP
11  
#define BOOST_JSON_IMPL_ERROR_IPP
11  
#define BOOST_JSON_IMPL_ERROR_IPP
12  

12  

13  
#include <boost/json/error.hpp>
13  
#include <boost/json/error.hpp>
14  

14  

15  
namespace boost {
15  
namespace boost {
16  
namespace json {
16  
namespace json {
17  
namespace detail {
17  
namespace detail {
18  

18  

19  
// msvc 14.0 has a bug that warns about inability to use constexpr
19  
// msvc 14.0 has a bug that warns about inability to use constexpr
20  
// construction here, even though there's no constexpr construction
20  
// construction here, even though there's no constexpr construction
21  
#if defined(_MSC_VER) && _MSC_VER <= 1900
21  
#if defined(_MSC_VER) && _MSC_VER <= 1900
22  
# pragma warning( push )
22  
# pragma warning( push )
23  
# pragma warning( disable : 4592 )
23  
# pragma warning( disable : 4592 )
24  
#endif
24  
#endif
25  
BOOST_JSON_CONSTINIT
25  
BOOST_JSON_CONSTINIT
26  
error_code_category_t error_code_category;
26  
error_code_category_t error_code_category;
27  

27  

28  
BOOST_JSON_CONSTINIT
28  
BOOST_JSON_CONSTINIT
29  
error_condition_category_t error_condition_category;
29  
error_condition_category_t error_condition_category;
30  
#if defined(_MSC_VER) && _MSC_VER <= 1900
30  
#if defined(_MSC_VER) && _MSC_VER <= 1900
31  
# pragma warning( pop )
31  
# pragma warning( pop )
32  
#endif
32  
#endif
33  

33  

34  
char const*
34  
char const*
35  
error_code_category_t::name() const noexcept
35  
error_code_category_t::name() const noexcept
36  
{
36  
{
37  
    return "boost.json";
37  
    return "boost.json";
38  
}
38  
}
39  

39  

40  
char const*
40  
char const*
41  
error_code_category_t::message( int ev, char*, std::size_t ) const noexcept
41  
error_code_category_t::message( int ev, char*, std::size_t ) const noexcept
42  
{
42  
{
43  
    switch(static_cast<error>(ev))
43  
    switch(static_cast<error>(ev))
44  
    {
44  
    {
45  
    default:
45  
    default:
46  
case error::syntax: return "syntax error";
46  
case error::syntax: return "syntax error";
47  
case error::extra_data: return "extra data";
47  
case error::extra_data: return "extra data";
48  
case error::incomplete: return "incomplete JSON";
48  
case error::incomplete: return "incomplete JSON";
49  
case error::exponent_overflow: return "exponent overflow";
49  
case error::exponent_overflow: return "exponent overflow";
50  
case error::too_deep: return "too deep";
50  
case error::too_deep: return "too deep";
51  
case error::illegal_leading_surrogate: return "illegal leading surrogate";
51  
case error::illegal_leading_surrogate: return "illegal leading surrogate";
52  
case error::illegal_trailing_surrogate: return "illegal trailing surrogate";
52  
case error::illegal_trailing_surrogate: return "illegal trailing surrogate";
53  
case error::expected_hex_digit: return "expected hex digit";
53  
case error::expected_hex_digit: return "expected hex digit";
54  
case error::expected_utf16_escape: return "expected utf16 escape";
54  
case error::expected_utf16_escape: return "expected utf16 escape";
55  
case error::object_too_large: return "object too large";
55  
case error::object_too_large: return "object too large";
56  
case error::array_too_large: return "array too large";
56  
case error::array_too_large: return "array too large";
57  
case error::key_too_large: return "key too large";
57  
case error::key_too_large: return "key too large";
58  
case error::string_too_large: return "string too large";
58  
case error::string_too_large: return "string too large";
59  
case error::number_too_large: return "number too large";
59  
case error::number_too_large: return "number too large";
60  
case error::input_error: return "input error";
60  
case error::input_error: return "input error";
61  

61  

62  
case error::exception: return "got exception";
62  
case error::exception: return "got exception";
63  
case error::out_of_range: return "out of range";
63  
case error::out_of_range: return "out of range";
64  
case error::test_failure: return "test failure";
64  
case error::test_failure: return "test failure";
65  

65  

66  
case error::missing_slash: return "missing slash character";
66  
case error::missing_slash: return "missing slash character";
67  
case error::invalid_escape: return "invalid escape sequence";
67  
case error::invalid_escape: return "invalid escape sequence";
68  
case error::token_not_number: return "token is not a number";
68  
case error::token_not_number: return "token is not a number";
69  
case error::value_is_scalar: return "current value is scalar";
69  
case error::value_is_scalar: return "current value is scalar";
70  
case error::not_found: return "no referenced value";
70  
case error::not_found: return "no referenced value";
71  
case error::token_overflow: return "token overflow";
71  
case error::token_overflow: return "token overflow";
72  
case error::past_the_end: return "past-the-end token not supported";
72  
case error::past_the_end: return "past-the-end token not supported";
73  

73  

74  
case error::not_number: return "not a number";
74  
case error::not_number: return "not a number";
75  
case error::not_exact: return "not exact";
75  
case error::not_exact: return "not exact";
76  
case error::not_null: return "value is not null";
76  
case error::not_null: return "value is not null";
77  
case error::not_bool: return "value is not boolean";
77  
case error::not_bool: return "value is not boolean";
78  
case error::not_array: return "value is not an array";
78  
case error::not_array: return "value is not an array";
79  
case error::not_object: return "value is not an object";
79  
case error::not_object: return "value is not an object";
80  
case error::not_string: return "value is not a string";
80  
case error::not_string: return "value is not a string";
81  
case error::not_int64: return "value is not a std::int64_t number";
81  
case error::not_int64: return "value is not a std::int64_t number";
82  
case error::not_uint64: return "value is not a std::uint64_t number";
82  
case error::not_uint64: return "value is not a std::uint64_t number";
83  
case error::not_double: return "value is not a double";
83  
case error::not_double: return "value is not a double";
84  
case error::not_integer: return "value is not integer";
84  
case error::not_integer: return "value is not integer";
85  
case error::size_mismatch: return "source composite size does not match target size";
85  
case error::size_mismatch: return "source composite size does not match target size";
86  
case error::exhausted_variants: return "exhausted all variants";
86  
case error::exhausted_variants: return "exhausted all variants";
87  
case error::unknown_name: return "unknown name";
87  
case error::unknown_name: return "unknown name";
88  
    }
88  
    }
89  
}
89  
}
90  

90  

91  
std::string
91  
std::string
92  
error_code_category_t::message( int ev ) const
92  
error_code_category_t::message( int ev ) const
93  
{
93  
{
94  
    return message( ev, nullptr, 0 );
94  
    return message( ev, nullptr, 0 );
95  
}
95  
}
96  

96  

97  
system::error_condition
97  
system::error_condition
98  
error_code_category_t::default_error_condition( int ev) const noexcept
98  
error_code_category_t::default_error_condition( int ev) const noexcept
99  
{
99  
{
100  
    switch(static_cast<error>(ev))
100  
    switch(static_cast<error>(ev))
101  
    {
101  
    {
102  
    default:
102  
    default:
103  
        return {ev, *this};
103  
        return {ev, *this};
104  

104  

105  
case error::syntax:
105  
case error::syntax:
106  
case error::extra_data:
106  
case error::extra_data:
107  
case error::incomplete:
107  
case error::incomplete:
108  
case error::exponent_overflow:
108  
case error::exponent_overflow:
109  
case error::too_deep:
109  
case error::too_deep:
110  
case error::illegal_leading_surrogate:
110  
case error::illegal_leading_surrogate:
111  
case error::illegal_trailing_surrogate:
111  
case error::illegal_trailing_surrogate:
112  
case error::expected_hex_digit:
112  
case error::expected_hex_digit:
113  
case error::expected_utf16_escape:
113  
case error::expected_utf16_escape:
114  
case error::object_too_large:
114  
case error::object_too_large:
115  
case error::array_too_large:
115  
case error::array_too_large:
116  
case error::key_too_large:
116  
case error::key_too_large:
117  
case error::string_too_large:
117  
case error::string_too_large:
118  
case error::number_too_large:
118  
case error::number_too_large:
119  
case error::input_error:
119  
case error::input_error:
120  
    return condition::parse_error;
120  
    return condition::parse_error;
121  

121  

122  
case error::missing_slash:
122  
case error::missing_slash:
123  
case error::invalid_escape:
123  
case error::invalid_escape:
124  
    return condition::pointer_parse_error;
124  
    return condition::pointer_parse_error;
125  

125  

126  
case error::token_not_number:
126  
case error::token_not_number:
127  
case error::value_is_scalar:
127  
case error::value_is_scalar:
128  
case error::not_found:
128  
case error::not_found:
129  
case error::token_overflow:
129  
case error::token_overflow:
130  
case error::past_the_end:
130  
case error::past_the_end:
131  
    return condition::pointer_use_error;
131  
    return condition::pointer_use_error;
132  

132  

133  
case error::not_number:
133  
case error::not_number:
134  
case error::not_exact:
134  
case error::not_exact:
135  
case error::not_null:
135  
case error::not_null:
136  
case error::not_bool:
136  
case error::not_bool:
137  
case error::not_array:
137  
case error::not_array:
138  
case error::not_object:
138  
case error::not_object:
139  
case error::not_string:
139  
case error::not_string:
140  
case error::not_int64:
140  
case error::not_int64:
141  
case error::not_uint64:
141  
case error::not_uint64:
142  
case error::not_double:
142  
case error::not_double:
143  
case error::not_integer:
143  
case error::not_integer:
144  
case error::size_mismatch:
144  
case error::size_mismatch:
145  
case error::exhausted_variants:
145  
case error::exhausted_variants:
146  
case error::unknown_name:
146  
case error::unknown_name:
147  
    return condition::conversion_error;
147  
    return condition::conversion_error;
148  

148  

149  
case error::exception:
149  
case error::exception:
150  
case error::out_of_range:
150  
case error::out_of_range:
151  
    return condition::generic_error;
151  
    return condition::generic_error;
152  
    }
152  
    }
153  
}
153  
}
154  

154  

155  
char const*
155  
char const*
156  
error_condition_category_t::name() const noexcept
156  
error_condition_category_t::name() const noexcept
157  
{
157  
{
158  
    return "boost.json";
158  
    return "boost.json";
159  
}
159  
}
160  

160  

161  
char const*
161  
char const*
162  
error_condition_category_t::message( int cv, char*, std::size_t ) const noexcept
162  
error_condition_category_t::message( int cv, char*, std::size_t ) const noexcept
163  
{
163  
{
164  
    switch(static_cast<condition>(cv))
164  
    switch(static_cast<condition>(cv))
165  
    {
165  
    {
166  
    default:
166  
    default:
167  
    case condition::parse_error:
167  
    case condition::parse_error:
168  
        return "A JSON parse error occurred";
168  
        return "A JSON parse error occurred";
169  
    case condition::pointer_parse_error:
169  
    case condition::pointer_parse_error:
170  
        return "A JSON Pointer parse error occurred";
170  
        return "A JSON Pointer parse error occurred";
171  
    case condition::pointer_use_error:
171  
    case condition::pointer_use_error:
172  
        return "An error occurred when JSON Pointer was used with"
172  
        return "An error occurred when JSON Pointer was used with"
173  
            " a value";
173  
            " a value";
174  
    case condition::conversion_error:
174  
    case condition::conversion_error:
175  
        return "An error occurred during conversion";
175  
        return "An error occurred during conversion";
176  
    }
176  
    }
177  
}
177  
}
178  

178  

179  
std::string
179  
std::string
180  
error_condition_category_t::message( int cv ) const
180  
error_condition_category_t::message( int cv ) const
181  
{
181  
{
182  
    return message( cv, nullptr, 0 );
182  
    return message( cv, nullptr, 0 );
183  
}
183  
}
184  

184  

185  
} // namespace detail
185  
} // namespace detail
186  

186  

187  
} // namespace json
187  
} // namespace json
188  
} // namespace boost
188  
} // namespace boost
189  

189  

190  
#endif
190  
#endif