#pragma once #include "Gallery_Renderables.h" #include #include #include #include #include #include #include namespace renderive::web { class Gallery_Controls final { public: using Json = nlohmann::json; template void add(Object& object) { const auto descriptor = adminive::Type_Descriptor::get(); add(descriptor.name(), descriptor.label(), object); } template void add(std::string id, Object& object) { add(std::move(id), adminive::Type_Descriptor::get().label(), object); } private: template void add(std::string id, std::string title, Object& object) { using Model = adminive::Object_Model_Type; auto* target = &object; entries_.push_back({ std::move(id), std::move(title), [target] { return Json{ {"descriptor", adminive::to_descriptor_json()}, {"view", adminive::to_view_json( adminive::describe_edit_view())}, {"data", adminive::to_frontend_json(*target)} }; }, [target](const Json& patch) { return adminive::apply_frontend_patch(*target, patch); } }); } public: [[nodiscard]] Json resources() const { Json result = Json::array(); for (const auto& entry : entries_) { Json resource = entry.resource(); resource["target"] = entry.id; resource["view"]["title"] = entry.title; result.push_back(std::move(resource)); } return result; } [[nodiscard]] adminive::Update_Result apply(std::string_view target, const Json& patch) const { for (const auto& entry : entries_) { if (entry.id == target) return entry.apply(patch); } adminive::Update_Result result; result.success = false; result.message = "unknown gallery control target: " + std::string(target); return result; } private: struct Entry { std::string id; std::string title; std::function resource; std::function apply; }; std::vector entries_; }; } // namespace renderive::web