#pragma once #include #include #include #include #include #include #include #include "settings.h" #include "http_server.h" #include "utility.h" #include "routing.h" // TEST #include #define CROW_ROUTE(app, url) app.route(url) namespace crow { class Crow { public: using self_t = Crow; Crow() { } response handle(const request& req) { return router_.handle(req); } template auto route(std::string&& rule) -> typename std::result_of)(Router, std::string&&)>::type { return router_.new_rule_tagged(std::move(rule)); } self_t& port(std::uint16_t port) { port_ = port; return *this; } self_t& multithreaded() { return concurrency(std::thread::hardware_concurrency()); } self_t& concurrency(std::uint16_t concurrency) { if (concurrency < 1) concurrency = 1; concurrency_ = concurrency; return *this; } void validate() { router_.validate(); } void run() { validate(); Server server(this, port_, concurrency_); server.run(); } void debug_print() { std::cerr << "Routing:" << std::endl; router_.debug_print(); } private: uint16_t port_ = 80; uint16_t concurrency_ = 1; Router router_; }; };