// GNU Lesser General Public License v3.0 // Copyright (c) 2025 Bart Beumer // // This program is free software; you can redistribute it and/or modify it // under the terms of the GNU Lesser General Public License v3.0 as published by // the Free Software Foundation. // #pragma once #include #include #include #include #include namespace bmrshared::web { class response_promise final { private: class response_writer_interface { public: virtual ~response_writer_interface() = default; virtual void write_response(boost::beast::tcp_stream&) = 0; }; template class response_writer : public response_writer_interface { public: template response_writer(TArgs... args) : m_response(args...) {} ~response_writer() override = default; void write_response(boost::beast::tcp_stream& stream) override { boost::beast::http::write(stream, m_response); } TResponse& response() { return m_response; } private: TResponse m_response; }; public: using response_sender = std::function; using callback_on_response = std::function; response_promise() = delete; explicit response_promise(callback_on_response cbOnResponse); ~response_promise(); template TResponse& CreateResponse(TArgs&&... args) { auto created = std::make_unique>(std::forward(args)...); auto& resp = created->response(); m_response_writer = std::move(created); return resp; } private: callback_on_response m_call_on_response; std::shared_ptr m_response_writer; }; } // namespace bmrshared::web