Experiment with new resource factory method

This commit is contained in:
2026-01-17 10:36:02 +01:00
parent f4f9c6898f
commit 42cfefd7d3
2 changed files with 13 additions and 38 deletions

View File

@@ -22,22 +22,12 @@
namespace art::seafire::resources namespace art::seafire::resources
{ {
template<Resource R, template<Resource R>
typename F, // TODO: Implement factory concept
typename... FactoryArgs>
class resource_handler_t { class resource_handler_t {
public: public:
using resource_type = R; using resource_type = R;
using factory_type = F;
explicit resource_handler_t();
resource_handler_t(factory_type factory, FactoryArgs&&... args);
factory_type const&
factory() const
{
return factory_;
}
void void
on_request(server::request_t& req, server::response_t& res) const; on_request(server::request_t& req, server::response_t& res) const;
@@ -48,16 +38,11 @@ namespace art::seafire::resources
on_request(req, res); on_request(req, res);
} }
private:
factory_type factory_;
std::tuple<FactoryArgs...> factory_args_;
}; };
template<Resource R, template<Resource R,
typename F, typename H = resource_handler_t<R>>
typename... FactoryArgs, H use_resource();
typename H = resource_handler_t<R, F, FactoryArgs...>>
H use_resource(F factory, FactoryArgs&&... args);
} // namespace art::seafire::resources } // namespace art::seafire::resources

View File

@@ -1,36 +1,26 @@
namespace art::seafire::resources namespace art::seafire::resources
{ {
template<Resource R, typename F, typename... FactoryArgs > template<Resource R>
resource_handler_t<R, F, FactoryArgs...>:: resource_handler_t<R>::
resource_handler_t(factory_type factory, FactoryArgs&&... args) resource_handler_t()
: factory_{std::move(factory)},
factory_args_{std::forward<FactoryArgs>(args)...}
{} {}
template< Resource R, typename F, typename... FactoryArgs > template< Resource R>
void void
resource_handler_t< R, F, FactoryArgs... >:: resource_handler_t<R>::
on_request(server::request_t& req, on_request(server::request_t& req,
server::response_t& res) const server::response_t& res) const
{ {
auto factory_invoker = [f = factory(), &req, &res](auto... args) -> decltype(auto) auto&& r = common::invoke(req, &R::make, req, res);
{
return common::invoke(req, &F::template factory<resource_type>::make, f, req, res, std::forward<decltype(args)>(args)...);
};
auto&& r = std::apply(factory_invoker, factory_args_);
handle(req, res, r); handle(req, res, r);
} }
template<Resource R, template<Resource R, typename H>
typename F,
typename... FactoryArgs,
typename H>
H H
use_resource(F factory, FactoryArgs&&... args) use_resource()
{ {
return H{std::move(factory), std::forward<FactoryArgs>(args)...}; return H{};
} }
} // namespace art::seafire::resources } // namespace art::seafire::resources