Seafire-Resources/seafire/resources/resource-handler.hxx
2025-03-07 02:25:53 +01:00

67 lines
1.7 KiB
C++

#ifndef seafire__resources__resource_handler_hxx_
#define seafire__resources__resource_handler_hxx_
#include <seafire/common/invoke.hxx>
#include <seafire/protocol/media-type.hxx>
#include <seafire/protocol/rfc7231/accept.hxx>
#include <seafire/protocol/rfc7231/content-type.hxx>
#include <seafire/protocol/rfc7232/entity-tag.hxx>
#include <seafire/protocol/rfc7232/etag.hxx>
#include <seafire/protocol/rfc7232/last-modified.hxx>
#include <seafire/resources/concepts.hxx>
#include <seafire/resources/handle.hxx>
#include <seafire/resources/traits.hxx>
#include <seafire/server/request.hxx>
#include <seafire/server/response.hxx>
#include <optional>
#include <string>
#include <tuple>
#include <vector>
namespace seafire::resources
{
template<Resource R,
typename F, // TODO: Implement factory concept
typename... FactoryArgs>
class resource_handler_t {
public:
using resource_type = R;
using factory_type = F;
explicit
resource_handler_t(factory_type factory, FactoryArgs&&... args);
factory_type const&
factory() const
{
return factory_;
}
void
on_request(server::request_t& req, server::response_t& res) const;
void
operator()(server::request_t& req, server::response_t& res) const
{
on_request(req, res);
}
private:
factory_type factory_;
std::tuple<FactoryArgs...> factory_args_;
};
template<Resource R,
typename F,
typename... FactoryArgs,
typename H = resource_handler_t<R, F, FactoryArgs...>>
H use_resource(F factory, FactoryArgs&&... args);
} // namespace seafire::resources
#include <seafire/resources/resource-handler.txx>
#endif