support deserialize.

This commit is contained in:
ykiko
2024-07-07 21:25:43 +08:00
parent fa2d451c67
commit b13ccf966f

View File

@@ -1,6 +1,5 @@
#pragma once
#include <nlohmann/json.hpp>
#include <Support/Reflection.h>
@@ -49,7 +48,32 @@ auto serialize(const Object& object) {
json.emplace(name, serialize(member));
}
});
return json;
return std::move(json);
}
}
template <typename Object>
Object deserialize(const json& json) {
if constexpr(std::is_fundamental_v<Object> || std::is_same_v<Object, std::string_view> ||
std::is_same_v<Object, std::string>) {
return json.get<Object>();
} else if constexpr(impl::is_vector_like_v<Object>) {
return json.get<Object>();
} else if constexpr(std::is_enum_v<Object>) {
return static_cast<Object>(json.get<std::underlying_type_t<Object>>());
} else {
Object object;
for_each(object, [&json](std::string_view name, auto& member) {
using Member = std::remove_cvref_t<decltype(member)>;
if constexpr(impl::is_optional_v<Member>) {
if(json.contains(name)) {
member = deserialize<Member>(json[name]);
}
} else {
member = deserialize<Member>(json[name]);
}
});
return std::move(object);
}
}