10#include "hellfire/serializers/Serializer.h"
11#include "nlohmann/json.hpp"
20 using DeserializeFn = std::function<
void(
Entity&,
const nlohmann::json &)>;
21 using HasComponentFn = std::function<
bool(
const Entity&)>;
33 template<ComponentType T>
35 const auto type = std::type_index(
typeid(T));
36 type_names_[type] = type_name;
37 name_to_type_.insert_or_assign(type_name, type);
39 has_component_[type] = [](
const Entity& e) {
40 return e.has_component<T>();
44 serializers_[type] = [](
const Entity& e) {
45 std::ostringstream stream;
46 Serializer<T>::serialize(stream, e.get_component<T>());
47 nlohmann::json j = nlohmann::json::parse(stream.str());
51 deserializers_[type_name] = [](Entity& e,
const nlohmann::json& j) {
52 auto comp = e.add_component<T>();
53 std::istringstream stream(j.dump());
54 Serializer<T>::deserialize(stream, comp);
59 nlohmann::ordered_json components = nlohmann::ordered_json::array();
61 for (
const auto& [type, has_fn] : has_component_) {
63 nlohmann::ordered_json comp = serializers_.at(type)(entity);
64 comp[
"_type"] = type_names_.at(type);
65 components.push_back(comp);
73 if (!comp_json.contains(
"_type"))
return false;
75 std::string type_name = comp_json.at(
"_type");
76 const auto it = deserializers_.find(type_name);
77 if (it == deserializers_.end())
return false;
79 it->second(entity, comp_json);
84 for (
const auto& comp_json : components) {
85 deserialize_component(entity, comp_json);
bool deserialize_component(Entity &entity, const nlohmann::json &comp_json) const
void register_component(const std::string &type_name)
ComponentRegistry(const ComponentRegistry &)=delete
ComponentRegistry & operator=(const ComponentRegistry &)=delete
ComponentRegistry()=default
std::unordered_map< std::type_index, SerializeFn > serializers_
std::unordered_map< std::string, DeserializeFn > deserializers_
nlohmann::json serialize_all_components(const Entity &entity) const
std::unordered_map< std::type_index, HasComponentFn > has_component_
std::unordered_map< std::string, std::type_index > name_to_type_
std::unordered_map< std::type_index, std::string > type_names_
static ComponentRegistry & instance()
void deserialize_all_components(Entity &entity, const nlohmann::json &components) const
void register_all_components()