From 8cc1719d1bce556516b6396ce02f5318334964e9 Mon Sep 17 00:00:00 2001 From: SweetId <2630750+SweetId@users.noreply.github.com> Date: Mon, 11 Mar 2024 19:08:10 -0400 Subject: [PATCH] [Serialization] Make JsonSerializationContext FilesystemAppComponent-compatible --- include/Nazara/Core/JsonSerialization.hpp | 5 +++++ src/Nazara/Core/JsonSerialization.cpp | 23 ++++++++++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/include/Nazara/Core/JsonSerialization.hpp b/include/Nazara/Core/JsonSerialization.hpp index dac51df5d..2008cc9ff 100644 --- a/include/Nazara/Core/JsonSerialization.hpp +++ b/include/Nazara/Core/JsonSerialization.hpp @@ -10,10 +10,13 @@ namespace Nz : public SerializationContext { public: + struct Params {}; + JsonSerializationContext(); ~JsonSerializationContext(); bool Load(const std::filesystem::path& path); + bool Load(Stream& stream); EnumSerializationMode GetEnumSerializationMode() const override { return EnumSerializationMode::String; } bool PushObject(std::string_view name) override; @@ -47,6 +50,8 @@ namespace Nz bool Read(std::string_view name, double* value) override; bool Read(std::string_view name, std::string* value) override; + static std::shared_ptr LoadFromStream(Stream& stream, const Params& params = {}); + private: std::unique_ptr m_impl; }; diff --git a/src/Nazara/Core/JsonSerialization.cpp b/src/Nazara/Core/JsonSerialization.cpp index 84eb7dd96..bcd5f5054 100644 --- a/src/Nazara/Core/JsonSerialization.cpp +++ b/src/Nazara/Core/JsonSerialization.cpp @@ -36,11 +36,20 @@ namespace Nz bool JsonSerializationContext::Load(const std::filesystem::path& path) { - std::ifstream file(path); - if (!file || !file.is_open()) + Nz::File file(path, Nz::OpenMode::Read); + return Load(file); + } + + bool JsonSerializationContext::Load(Stream& stream) + { + if (!stream.IsReadable()) return false; - m_impl->json = nlohmann::json::parse(file); + auto size = stream.GetSize(); + std::vector content(size); + stream.Read(content.data(), content.size()); + + m_impl->json = nlohmann::json::parse(content.begin(), content.end()); m_impl->stack.push(&m_impl->json); return true; } @@ -129,4 +138,12 @@ namespace Nz *value = m_impl->Top()[name].get(); return true; } + + std::shared_ptr JsonSerializationContext::LoadFromStream(Stream& stream, const JsonSerializationContext::Params&) + { + std::shared_ptr context = std::make_shared(); + if (context->Load(stream)) + return context; + return {}; + } }