network-experiment/bmrshared-web/include/bmrshared/response_promise.hpp

76 lines
1.9 KiB
C++

// GNU Lesser General Public License v3.0
// Copyright (c) 2025 Bart Beumer <bart@4beumer.nl>
//
// 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 <boost/asio/io_context.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/beast.hpp>
#include <functional>
#include <utility>
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<typename TResponse>
class response_writer : public response_writer_interface
{
public:
template<typename... TArgs>
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<void(boost::beast::tcp_stream& stream)>;
using callback_on_response = std::function<void(response_sender fnSendResponse)>;
response_promise() = delete;
explicit response_promise(callback_on_response cbOnResponse);
~response_promise();
template<typename TResponse, typename... TArgs>
TResponse& CreateResponse(TArgs&&... args)
{
auto created = std::make_unique<response_writer<TResponse>>(std::forward<TArgs>(args)...);
auto& resp = created->response();
m_response_writer = std::move(created);
return resp;
}
private:
callback_on_response m_call_on_response;
std::shared_ptr<response_writer_interface> m_response_writer;
};
} // namespace bmrshared::web