#pragma once #include #include #include #include #include "nf7.hh" namespace nf7 { template struct EnumSerializer { public: static auto& save(auto& ar, auto t) { ar(magic_enum::enum_name(t)); return ar; } static auto& load(auto& ar, auto& t) { std::string v; ar(v); if (auto ot = magic_enum::enum_cast(v)) { t = *ot; } else { throw nf7::DeserializeException {"unknown enum: "+v}; } return ar; } }; #define NF7_YAS_DEFINE_ENUM_SERIALIZER(T) \ template \ struct serializer< \ yas::detail::type_prop::is_enum, \ yas::detail::ser_case::use_internal_serializer, \ F, T> : nf7::EnumSerializer { \ } } // namespace nf7