#pragma once #include "http_request.h" #include "http_response.h" #include "utility.h" namespace crow { namespace detail { template struct PartialContext : public black_magic::PopBack::template rebind< PartialContext>, public black_magic::LastElementType::type::Context { using parent_context = typename black_magic::PopBack< Middlewares...>::template rebind<::crow::detail::PartialContext>; template using partial = typename std::conditional< N == sizeof...(Middlewares) - 1, PartialContext, typename parent_context::template partial>::type; template typename T::Context& get() { return static_cast(*this); } }; template <> struct PartialContext<> { template using partial = PartialContext; }; template bool middlewareCallHelper(Container& middlewares, Request& req, Response& res, Context& ctx); template struct Context : private PartialContext // struct Context : private Middlewares::context... // simple but less type-safe { template friend typename std::enable_if<(N == 0)>::type afterHandlersCallHelper(Container& middlewares, Context& ctx, Request& req, Response& res); template friend typename std::enable_if<(N > 0)>::type afterHandlersCallHelper(Container& middlewares, Context& ctx, Request& req, Response& res); template friend bool middlewareCallHelper(Container& middlewares, Request& req, Response& res, Context& ctx); template typename T::Context& get() { return static_cast(*this); } template using partial = typename PartialContext::template partial; }; } // namespace detail } // namespace crow