You've already forked libart-seafire-resources
Experiment with new resource factory method
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user