Skip to content

Commit 76cfc30

Browse files
committed
JSONCONS_N_MEMBER_TRAITS error messages
1 parent a290b80 commit 76cfc30

File tree

2 files changed

+15
-68
lines changed

2 files changed

+15
-68
lines changed

include/jsoncons/reflect/json_reflect_traits_gen.hpp

Lines changed: 13 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -505,76 +505,28 @@ namespace reflect { \
505505
JSONCONS_CATCH(...) {return false;}
506506

507507
#define JSONCONS_N_MEMBER_NAME_AS(P1, P2, P3, Seq, Count) JSONCONS_N_MEMBER_NAME_AS_LAST(P1, P2, P3, Seq, Count)
508-
#define JSONCONS_N_MEMBER_NAME_AS_LAST(P1, P2, P3, Seq, Count) if ((num_params-Count) < num_mandatory_params1) { JSONCONS_PP_EXPAND(JSONCONS_PP_CONCAT(JSONCONS_N_MEMBER_NAME_AS_,JSONCONS_NARGS Seq) Seq)
508+
#define JSONCONS_N_MEMBER_NAME_AS_LAST(P1, P2, P3, Seq, Count) JSONCONS_PP_EXPAND(JSONCONS_PP_CONCAT(JSONCONS_N_MEMBER_NAME_AS_,JSONCONS_NARGS Seq) Seq)
509509
#define JSONCONS_N_MEMBER_NAME_AS_2(Member, Name) \
510-
if (!json_traits_helper<Json>::set_member(ajson,Name,class_instance.Member)) \
511-
{ \
512-
return result_type(jsoncons::unexpect, conv_errc::missing_required_member, json_object_member_names<value_type>::Member(unexpect)); \
513-
} \
514-
} else {json_traits_helper<Json>::set_member(ajson,Name,class_instance.Member);}
510+
if (ajson.contains(Name)) {json_traits_helper<Json>::set_member(ajson,Name,class_instance.Member);}
515511
#define JSONCONS_N_MEMBER_NAME_AS_3(Member, Name, Mode) Mode(JSONCONS_N_MEMBER_NAME_AS_2(Member, Name))
516512
#define JSONCONS_N_MEMBER_NAME_AS_4(Member, Name, Mode, Match) \
517-
Mode( \
518-
if (!json_traits_helper<Json>::set_member(ajson,Name,class_instance.Member)) \
519-
{ \
520-
return result_type(jsoncons::unexpect, conv_errc::missing_required_member, json_object_member_names<value_type>::Member(unexpect)); \
521-
} \
522-
) \
523-
} else Mode(json_traits_helper<Json>::set_member(ajson,Name,class_instance.Member));
513+
Mode(if (ajson.contains(Name)) {json_traits_helper<Json>::set_member(ajson,Name,class_instance.Member);})
524514
#define JSONCONS_N_MEMBER_NAME_AS_5(Member, Name, Mode, Match, Into) \
525-
Mode( \
526-
if (!json_traits_helper<Json>::set_member<typename std::decay<decltype(Into((std::declval<value_type*>())->Member))>::type>(ajson, Name, class_instance.Member)) \
527-
{ \
528-
return result_type(jsoncons::unexpect, conv_errc::missing_required_member, json_object_member_names<value_type>::Member(unexpect)); \
529-
} \
530-
} else Mode(json_traits_helper<Json>::set_member<typename std::decay<decltype(Into((std::declval<value_type*>())->Member))>::type>(ajson, Name, class_instance.Member))
515+
Mode(if (ajson.contains(Name)) {json_traits_helper<Json>::template set_member<typename std::decay<decltype(Into((std::declval<value_type*>())->Member))>::type>(ajson,Name,class_instance.Member);})
531516
#define JSONCONS_N_MEMBER_NAME_AS_6(Member, Name, Mode, Match, Into, From) \
532-
Mode( \
533-
if (!json_traits_helper<Json>::set_member<typename std::decay<decltype(Into((std::declval<value_type*>())->Member))>::type>(ajson, Name, From, class_instance.Member)) \
534-
{ \
535-
return result_type(jsoncons::unexpect, conv_errc::missing_required_member, json_object_member_names<value_type>::Member(unexpect)); \
536-
} \
537-
) \
538-
} else Mode(json_traits_helper<Json>::set_member<typename std::decay<decltype(Into((std::declval<value_type*>())->Member))>::type>(ajson, Name, From, class_instance.Member))
517+
Mode(if (ajson.contains(Name)) {json_traits_helper<Json>::template set_member<typename std::decay<decltype(Into((std::declval<value_type*>())->Member))>::type>(ajson,Name,From,class_instance.Member);})
539518

540519
#define JSONCONS_ALL_MEMBER_NAME_AS(P1, P2, P3, Seq, Count) JSONCONS_ALL_MEMBER_NAME_AS_LAST(P1, P2, P3, Seq, Count)
541520
#define JSONCONS_ALL_MEMBER_NAME_AS_LAST(P1, P2, P3, Seq, Count) JSONCONS_PP_EXPAND(JSONCONS_PP_CONCAT(JSONCONS_ALL_MEMBER_NAME_AS_,JSONCONS_NARGS Seq) Seq)
542521
#define JSONCONS_ALL_MEMBER_NAME_AS_2(Member, Name) \
543-
if (!json_traits_helper<Json>::set_member(ajson, Name, class_instance.Member)) \
544-
{ \
545-
return result_type(jsoncons::unexpect, conv_errc::missing_required_member, json_object_member_names<value_type>::Member(unexpect)); \
546-
}
522+
json_traits_helper<Json>::set_member(ajson,Name,class_instance.Member);
547523
#define JSONCONS_ALL_MEMBER_NAME_AS_3(Member, Name, Mode) Mode(JSONCONS_ALL_MEMBER_NAME_AS_2(Member, Name))
548524
#define JSONCONS_ALL_MEMBER_NAME_AS_4(Member, Name, Mode, Match) \
549-
Mode( \
550-
if (!json_traits_helper<Json>::set_member(ajson, Name, class_instance.Member)) \
551-
{ \
552-
return result_type(jsoncons::unexpect, conv_errc::missing_required_member, json_object_member_names<value_type>::Member(unexpect)); \
553-
} \
554-
)
525+
Mode(json_traits_helper<Json>::set_member(ajson,Name,class_instance.Member);)
555526
#define JSONCONS_ALL_MEMBER_NAME_AS_5(Member, Name, Mode, Match, Into) \
556-
Mode( \
557-
if (!json_traits_helper<Json>::set_member<typename std::decay<decltype(Into((std::declval<value_type*>())->Member))>::type>(ajson, Name, class_instance.Member)) \
558-
{ \
559-
return result_type(jsoncons::unexpect, conv_errc::missing_required_member, json_object_member_names<value_type>::Member(unexpect)); \
560-
} \
561-
)
527+
Mode(json_traits_helper<Json>::template set_member<typename std::decay<decltype(Into((std::declval<value_type*>())->Member))>::type>(ajson,Name,class_instance.Member);)
562528
#define JSONCONS_ALL_MEMBER_NAME_AS_6(Member, Name, Mode, Match, Into, From) \
563-
Mode( \
564-
if (!json_traits_helper<Json>::set_member<typename std::decay<decltype(Into((std::declval<value_type*>())->Member))>::type>(ajson, Name, From, class_instance.Member)) \
565-
{ \
566-
return result_type(jsoncons::unexpect, conv_errc::missing_required_member, json_object_member_names<value_type>::Member(unexpect)); \
567-
} \
568-
)
569-
570-
#define JSONCONS_GENERATE_UNEXPECT_STR(P1, P2, P3, Seq, Count) JSONCONS_GENERATE_UNEXPECT_STR_LAST(P1, P2, P3, Seq, Count)
571-
#define JSONCONS_GENERATE_UNEXPECT_STR_LAST(P1, P2, P3, Seq, Count) JSONCONS_PP_EXPAND(JSONCONS_PP_CONCAT(JSONCONS_GENERATE_UNEXPECT_STR_,JSONCONS_NARGS Seq) Seq)
572-
#define JSONCONS_GENERATE_UNEXPECT_STR_2(Member, Name) \
573-
static inline const std::string& Member(unexpect_t) {static std::string sv = std::string(class_name) + ("." # Member); return sv;}
574-
#define JSONCONS_GENERATE_UNEXPECT_STR_3(Member, Name, Mode) Mode(JSONCONS_GENERATE_UNEXPECT_STR_2(Member, Name))
575-
#define JSONCONS_GENERATE_UNEXPECT_STR_4(Member, Name, Mode, Match) Mode(JSONCONS_GENERATE_UNEXPECT_STR_2(Member, Name))
576-
#define JSONCONS_GENERATE_UNEXPECT_STR_5(Member, Name, Mode, Match, Into) Mode(JSONCONS_GENERATE_UNEXPECT_STR_2(Member, Name))
577-
#define JSONCONS_GENERATE_UNEXPECT_STR_6(Member, Name, Mode, Match, Into, From) Mode(JSONCONS_GENERATE_UNEXPECT_STR_2(Member, Name))
529+
Mode(json_traits_helper<Json>::template set_member<typename std::decay<decltype(Into((std::declval<value_type*>())->Member))>::type>(ajson,Name,From,class_instance.Member);)
578530

579531
#define JSONCONS_N_MEMBER_NAME_TO_JSON(P1, P2, P3, Seq, Count) JSONCONS_N_MEMBER_NAME_TO_JSON_LAST(P1, P2, P3, Seq, Count)
580532
#define JSONCONS_N_MEMBER_NAME_TO_JSON_LAST(P1, P2, P3, Seq, Count) if ((num_params-Count) < num_mandatory_params2) JSONCONS_PP_EXPAND(JSONCONS_PP_CONCAT(JSONCONS_N_MEMBER_NAME_TO_JSON_,JSONCONS_NARGS Seq) Seq)
@@ -671,12 +623,6 @@ else \
671623
#define JSONCONS_MEMBER_NAME_TRAITS_BASE(AsT,ToJ,ObjectSize,EnMem, NumTemplateParams, ClassType,NumMandatoryParams1,NumMandatoryParams2, ...) \
672624
namespace jsoncons { \
673625
namespace reflect { \
674-
template <JSONCONS_GENERATE_TPL_PARAMS(JSONCONS_GENERATE_TPL_PARAM, NumTemplateParams)> \
675-
struct json_object_member_names<ClassType JSONCONS_GENERATE_TPL_ARGS(JSONCONS_GENERATE_TPL_ARG, NumTemplateParams)> \
676-
{ \
677-
constexpr static const char* class_name = # ClassType; \
678-
JSONCONS_VARIADIC_FOR_EACH(JSONCONS_GENERATE_UNEXPECT_STR,ClassType,,, __VA_ARGS__)\
679-
}; \
680626
template <typename Json JSONCONS_GENERATE_TPL_PARAMS(JSONCONS_GENERATE_MORE_TPL_PARAM, NumTemplateParams)> \
681627
struct json_conv_traits<Json, ClassType JSONCONS_GENERATE_TPL_ARGS(JSONCONS_GENERATE_TPL_ARG, NumTemplateParams)> \
682628
{ \
@@ -698,6 +644,7 @@ namespace reflect { \
698644
static result_type try_as(const Json& ajson) \
699645
{ \
700646
if (!ajson.is_object()) return result_type(jsoncons::unexpect, conv_errc::expected_object, # ClassType); \
647+
if (!is(ajson)) return result_type(jsoncons::unexpect, conv_errc::missing_required_member, # ClassType); \
701648
value_type class_instance{}; \
702649
JSONCONS_VARIADIC_FOR_EACH(AsT,,,, __VA_ARGS__) \
703650
return result_type(std::move(class_instance)); \
@@ -778,7 +725,7 @@ namespace reflect { \
778725
template <JSONCONS_GENERATE_TPL_PARAMS(JSONCONS_GENERATE_TPL_PARAM, NumTemplateParams)> \
779726
struct json_object_member_names<ClassType JSONCONS_GENERATE_TPL_ARGS(JSONCONS_GENERATE_TPL_ARG, NumTemplateParams)> \
780727
{ \
781-
JSONCONS_VARIADIC_FOR_EACH(JSONCONS_GENERATE_NAME_STR,ClassType,,, __VA_ARGS__)\
728+
JSONCONS_VARIADIC_FOR_EACH(JSONCONS_GENERATE_NAME_STR, ,,, __VA_ARGS__)\
782729
}; \
783730
template <typename Json JSONCONS_GENERATE_TPL_PARAMS(JSONCONS_GENERATE_MORE_TPL_PARAM, NumTemplateParams)> \
784731
struct json_conv_traits<Json, ClassType JSONCONS_GENERATE_TPL_ARGS(JSONCONS_GENERATE_TPL_ARG, NumTemplateParams)> \
@@ -943,7 +890,7 @@ namespace reflect { \
943890
template<> \
944891
struct json_object_member_names<EnumType> \
945892
{ \
946-
JSONCONS_VARIADIC_FOR_EACH(JSONCONS_GENERATE_NAME_STR,EnumType,,, __VA_ARGS__)\
893+
JSONCONS_VARIADIC_FOR_EACH(JSONCONS_GENERATE_NAME_STR, ,,, __VA_ARGS__)\
947894
}; \
948895
template <typename Json> \
949896
struct json_conv_traits<Json, EnumType> \
@@ -1166,7 +1113,7 @@ namespace reflect { \
11661113
template <JSONCONS_GENERATE_TPL_PARAMS(JSONCONS_GENERATE_TPL_PARAM, NumTemplateParams)> \
11671114
struct json_object_member_names<ClassType JSONCONS_GENERATE_TPL_ARGS(JSONCONS_GENERATE_TPL_ARG, NumTemplateParams)> \
11681115
{ \
1169-
JSONCONS_VARIADIC_FOR_EACH(JSONCONS_GENERATE_NAME_STR,ClassType,,, __VA_ARGS__)\
1116+
JSONCONS_VARIADIC_FOR_EACH(JSONCONS_GENERATE_NAME_STR, ,,, __VA_ARGS__)\
11701117
}; \
11711118
template <typename Json JSONCONS_GENERATE_TPL_PARAMS(JSONCONS_GENERATE_MORE_TPL_PARAM, NumTemplateParams)> \
11721119
struct json_conv_traits<Json, ClassType JSONCONS_GENERATE_TPL_ARGS(JSONCONS_GENERATE_TPL_ARG, NumTemplateParams)> \

test/corelib/src/json_validation_tests.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ TEST_CASE("json validator tests")
191191
}
192192
else
193193
{
194-
REQUIRE_THROWS_WITH(*it, "ns::employee_AMN: Unable to convert into the provided type");
194+
REQUIRE_THROWS_WITH(*it, "ns::employee_AMN: Missing required JSON object member");
195195
}
196196
}
197197
}
@@ -210,7 +210,7 @@ TEST_CASE("json validator tests")
210210
}
211211
else
212212
{
213-
REQUIRE_THROWS_WITH(*it, "ns::employee_NMN: Unable to convert into the provided type");
213+
REQUIRE_THROWS_WITH(*it, "ns::employee_NMN: Missing required JSON object member");
214214
}
215215
}
216216
}

0 commit comments

Comments
 (0)