#ifndef seafire__server__middleware_hxx_ #define seafire__server__middleware_hxx_ #include #include #include namespace seafire::server { /// Implements middleware functionality. /// class middleware_t { public: template middleware_t(T handler) : handler_{std::make_shared>(std::move(handler))} {} void invoke(request_t&, response_t&, request_handler_t const&) const; template friend middleware_t make_middleware(Args&&...); private: struct concept_t { virtual ~concept_t() noexcept = default; virtual void invoke(request_t&, response_t&, request_handler_t const&) const = 0; }; template struct container_t : concept_t { template container_t(Args&&... args) : handler{std::forward(args)...} {} void invoke(request_t& req, response_t& res, request_handler_t const& next) const override { handler(req, res, next); } T handler; }; explicit middleware_t(std::shared_ptr); std::shared_ptr handler_; }; template middleware_t make_middleware(Args&&... args) { return middleware_t{ std::make_shared>(std::forward(args)...) }; } request_handler_t make_middleware(std::vector const&, request_handler_t); } // namespace seafire::server #endif