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
|
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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user