#pragma once #include "baserule.hpp" #include "ruleparametertraits.hpp" #include "websocket.hpp" #include #include #include #include #include namespace crow { namespace detail { template struct Wrapped {}; template struct Wrapped> { explicit Wrapped(Func f) : handler(std::move(f)) {} std::function handler; void operator()(const Request& req, const std::shared_ptr& asyncResp, const std::vector& params) { if constexpr (sizeof...(ArgsWrapped) == 2) { handler(req, asyncResp); } else if constexpr (sizeof...(ArgsWrapped) == 3) { handler(req, asyncResp, params[0]); } else if constexpr (sizeof...(ArgsWrapped) == 4) { handler(req, asyncResp, params[0], params[1]); } else if constexpr (sizeof...(ArgsWrapped) == 5) { handler(req, asyncResp, params[0], params[1], params[2]); } else if constexpr (sizeof...(ArgsWrapped) == 6) { handler(req, asyncResp, params[0], params[1], params[2], params[3]); } else if constexpr (sizeof...(ArgsWrapped) == 7) { handler(req, asyncResp, params[0], params[1], params[2], params[3], params[4]); } } }; } // namespace detail class DynamicRule : public BaseRule, public RuleParameterTraits { public: explicit DynamicRule(const std::string& ruleIn) : BaseRule(ruleIn) {} void validate() override { if (!erasedHandler) { throw std::runtime_error("no handler for url " + rule); } } void handle(const Request& req, const std::shared_ptr& asyncResp, const std::vector& params) override { erasedHandler(req, asyncResp, params); } template void operator()(Func f) { using boost::callable_traits::args_t; erasedHandler = detail::Wrapped>(std::move(f)); } private: std::function&, const std::vector&)> erasedHandler; }; } // namespace crow