67 lines
1.7 KiB
C++
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
|