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
{
template<Resource R,
typename F, // TODO: Implement factory concept
typename... FactoryArgs>
template<Resource R>
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_;
}
resource_handler_t();
void
on_request(server::request_t& req, server::response_t& res) const;
@@ -48,16 +38,11 @@ namespace art::seafire::resources
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);
typename H = resource_handler_t<R>>
H use_resource();
} // namespace art::seafire::resources

View File

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