diff --git a/src/fragment_store/message_fragment_store.cpp b/src/fragment_store/message_fragment_store.cpp index 24c4b31..07383a7 100644 --- a/src/fragment_store/message_fragment_store.cpp +++ b/src/fragment_store/message_fragment_store.cpp @@ -41,6 +41,11 @@ namespace Message::Components { } // Message::Components +namespace Fragment::Components { + NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(MessagesTSRange, begin, end) + NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(MessagesContact, id) +} // Fragment::Components + template static bool serl_json_default(void* comp, nlohmann::json& out) { if constexpr (!std::is_empty_v) { @@ -64,19 +69,6 @@ static bool serl_json_msg_ts_range(void* comp, nlohmann::json& out) { return true; } -static bool deserl_json_msg_ts_range(FragmentHandle fh, const nlohmann::json& in) { - // TODO: this is ugly in multiple places - try { - fh.emplace_or_replace(FragComp::MessagesTSRange{ - in["begin"], - in["end"] - }); - } catch(...) { - return false; - } - return true; -} - static bool serl_json_msg_c_id(void* comp, nlohmann::json& out) { if (comp == nullptr) { return false; @@ -91,18 +83,6 @@ static bool serl_json_msg_c_id(void* comp, nlohmann::json& out) { return true; } -static bool deserl_json_msg_c_id(FragmentHandle fh, const nlohmann::json& in) { - // TODO: this is ugly in multiple places - try { - fh.emplace_or_replace(FragComp::MessagesContact{ - in["id"] - }); - } catch(...) { - return false; - } - return true; -} - void MessageFragmentStore::handleMessage(const Message3Handle& m) { if (!static_cast(m)) { return; // huh? @@ -235,25 +215,37 @@ MessageFragmentStore::MessageFragmentStore( _rmm.subscribe(this, RegistryMessageModel_Event::message_destroy); _fs._sc.registerSerializerJson(serl_json_msg_ts_range); - _fs._sc.registerDeSerializerJson(deserl_json_msg_ts_range); + _fs._sc.registerDeSerializerJson(); _fs._sc.registerSerializerJson(serl_json_msg_c_id); - _fs._sc.registerDeSerializerJson(deserl_json_msg_c_id); + _fs._sc.registerDeSerializerJson(); _sc.registerSerializerJson(serl_json_default); + _sc.registerDeSerializerJson(); _sc.registerSerializerJson(serl_json_default); + _sc.registerDeSerializerJson(); _sc.registerSerializerJson(serl_json_default); + _sc.registerDeSerializerJson(); _sc.registerSerializerJson(serl_json_default); + _sc.registerDeSerializerJson(); _sc.registerSerializerJson(serl_json_default); + _sc.registerDeSerializerJson(); _sc.registerSerializerJson(serl_json_default); + _sc.registerDeSerializerJson(); _sc.registerSerializerJson(serl_json_default); + _sc.registerDeSerializerJson(); _sc.registerSerializerJson(serl_json_default); + _sc.registerDeSerializerJson(); _sc.registerSerializerJson(serl_json_default); + _sc.registerDeSerializerJson(); // files //_sc.registerSerializerJson() _sc.registerSerializerJson(serl_json_default); + _sc.registerDeSerializerJson(); _sc.registerSerializerJson(serl_json_default); + _sc.registerDeSerializerJson(); _sc.registerSerializerJson(serl_json_default); + _sc.registerDeSerializerJson(); _fs.scanStoragePath("test_message_store/"); } diff --git a/src/fragment_store/serializer.hpp b/src/fragment_store/serializer.hpp index bf12c4e..1f94f0d 100644 --- a/src/fragment_store/serializer.hpp +++ b/src/fragment_store/serializer.hpp @@ -2,6 +2,7 @@ #include #include +#include #include @@ -16,12 +17,41 @@ struct SerializerCallbacks { using deserialize_json_fn = bool(*)(FragmentHandle fh, const nlohmann::json& in); entt::dense_map _deserl_json; + template + static bool component_emplace_or_replace_json(FragmentHandle fh, const nlohmann::json& j) { + if constexpr (std::is_empty_v) { + fh.emplace_or_replace(); // assert empty json? + } else { + fh.emplace_or_replace(static_cast(j)); + } + return true; + } + + template + static bool component_get_json(const FragmentHandle fh, nlohmann::json& j) { + if (fh.all_of()) { + if constexpr (!std::is_empty_v) { + j = fh.get(); + } + return true; + } + + return false; + } + void registerSerializerJson(serialize_json_fn fn, const entt::type_info& type_info); + template void registerSerializerJson(serialize_json_fn fn, const entt::type_info& type_info = entt::type_id()) { registerSerializerJson(fn, type_info); } void registerDeSerializerJson(deserialize_json_fn fn, const entt::type_info& type_info); + template - void registerDeSerializerJson(deserialize_json_fn fn, const entt::type_info& type_info = entt::type_id()) { registerDeSerializerJson(fn, type_info); } + void registerDeSerializerJson( + deserialize_json_fn fn = component_emplace_or_replace_json, + const entt::type_info& type_info = entt::type_id() + ) { + registerDeSerializerJson(fn, type_info); + } };