Skip to content

Commit 65ec084

Browse files
committed
Change ErrBadEnum to improve the error message
1 parent 581d5cb commit 65ec084

File tree

4 files changed

+49
-10
lines changed

4 files changed

+49
-10
lines changed

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Change log
33

44
This project follows [Semantic Versioning](http://semver.org/).
55

6-
1.1.0 (IN PROGRESS)
6+
1.1.0 (2025-07-26)
77
==================
88

99
### New features
@@ -13,6 +13,8 @@ This project follows [Semantic Versioning](http://semver.org/).
1313

1414
### Changes
1515

16+
* Change ErrBadEnum to improve the error message.
17+
1618
### Fixes
1719

1820
1.0.3 (2025-04-04)

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ Summary of features
4343
* The input is in UTF-8 format. The string tokens can contain escape sequences with
4444
[UTF-16 code points].
4545
* `//` comments are supported. Note that these are not part of the JSON standard.
46-
* Number values can be fetched as signed integers (32 or 64 bit) or as 64-bit float values.
46+
* Number values can be fetched as integers (32 or 64 bit) or as 64-bit float values.
4747
* Exceptions are used to handle the errors. See [error handling].
4848
* Value validation is easy and doesn't require a JSON schema. See:
4949
- [Number range checking].

ujson.cpp

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ int32_t Str::get_enum_idx(const char* const str_set[], size_t len) const
380380
for (size_t i = 0; i < len; i++) {
381381
if (strcmp(str, str_set[i]) == 0) return static_cast<int32_t>(i);
382382
}
383-
throw ErrBadEnum(*this);
383+
throw ErrBadEnum(*this, str, str_set, len);
384384
}
385385

386386
int32_t Arr::get_len() const noexcept
@@ -935,9 +935,6 @@ std::string ErrValue::get_err_str() const
935935
else if (val_idx >= 0) {
936936
str += " value index: " + std::to_string(val_idx) + '\n';
937937
}
938-
if (val_type != vtNone) {
939-
str += " val_type: " + type_to_str(val_type) + '\n';
940-
}
941938
return str;
942939
}
943940

@@ -950,8 +947,11 @@ ErrBadType::ErrBadType(const Val& v, ValType expected) noexcept
950947
std::string ErrBadType::get_err_str() const
951948
{
952949
std::string str = ErrValue::get_err_str();
950+
if (val_type != vtNone) {
951+
str += " value type: " + type_to_str(val_type) + '\n';
952+
}
953953
if (expected_type != vtNone) {
954-
str += " expected_type: " + type_to_str(expected_type) + '\n';
954+
str += " expected type: " + type_to_str(expected_type) + '\n';
955955
}
956956
return str;
957957
}
@@ -1001,9 +1001,37 @@ ErrUnknownMember::ErrUnknownMember(const Val& v) noexcept
10011001
{
10021002
}
10031003

1004-
ErrBadEnum::ErrBadEnum(const Val& v) noexcept
1005-
: ErrValue("unsupported value", v)
1004+
ErrBadEnum::ErrBadEnum(
1005+
const Val& v,
1006+
const char* bad_str,
1007+
const char* const set[],
1008+
size_t set_len
1009+
) noexcept
1010+
: ErrValue("value is not in allowed set", v)
10061011
{
1012+
this->bad_str = bad_str;
1013+
for (size_t i = 0; i < set_len; i++) {
1014+
this->set.push_back(set[i]);
1015+
}
1016+
}
1017+
1018+
std::string ErrBadEnum::get_err_str() const
1019+
{
1020+
std::string str = ErrValue::get_err_str();
1021+
str += " bad value: " + bad_str + '\n';
1022+
if (set.size() > 0) {
1023+
str += " allowed set: (";
1024+
bool first = true;
1025+
for (auto& s : set) {
1026+
if (!first) {
1027+
str += '|';
1028+
}
1029+
str += s;
1030+
first = false;
1031+
}
1032+
str += ")\n";
1033+
}
1034+
return str;
10071035
}
10081036

10091037
void Json::clear() noexcept

ujson.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <stdexcept>
55
#include <string>
66
#include <array>
7+
#include <vector>
78

89
namespace ujson {
910

@@ -254,7 +255,15 @@ struct ErrUnknownMember : ErrValue
254255

255256
struct ErrBadEnum : ErrValue
256257
{
257-
explicit ErrBadEnum(const Val& v) noexcept;
258+
std::string bad_str;
259+
std::vector<std::string> set;
260+
261+
explicit ErrBadEnum(
262+
const Val& v,
263+
const char* bad_str,
264+
const char* const set[],
265+
size_t set_len) noexcept;
266+
std::string get_err_str() const override;
258267
};
259268

260269
}; // namespace ujson

0 commit comments

Comments
 (0)