@@ -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
386386int32_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
950947std::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
10091037void Json::clear () noexcept
0 commit comments