From 851882f9552b5a697fc1ed141f89f9f7caa7349a Mon Sep 17 00:00:00 2001 From: Niklas Halle Date: Sun, 23 Aug 2020 14:55:31 +0200 Subject: prototype, not returning json yet --- src/main.cpp | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 8 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 57e4686..58d5791 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,25 +1,72 @@ #include +#include +#include #include "crow.h" +#define NULL_STRING std::string("null") +#define EMPTY_STRING std::string("") +#define NO_SUCH_COMMAND std::string("no_such_command") + +typedef std::function handler_func; + +struct CommandHandler { + [[nodiscard]] std::string exec(std::string const &arguments, std::string const &session) const { + return func(arguments, session, payload); + } + + handler_func func; + void *payload{nullptr}; +}; + +std::string stopHandler(std::string const &arguments, std::string const &session, void *payload); +std::string klingerHandler(std::string const &arguments, std::string const &session, void *payload); + +[[maybe_unused]] void decl_me_daddy(int not_an_int) { (void) not_an_int; } + int main() { crow::SimpleApp app; - CROW_ROUTE(app, "/add_json") + // command --> handler + static std::unordered_map const commands{ + {"stop", {stopHandler, &app}}, + {"klinger", {klingerHandler}} + }; + + CROW_ROUTE(app, "/") .methods("POST"_method) - ([](crow::request const &request) { + ([&app](crow::request const &request) { auto data = crow::json::load(request.body); + if (!data) return crow::response(400); - auto sum = data["a"].i() + data["b"].i(); - std::ostringstream os; - os << sum; - return crow::response{os.str()}; + + std::string command = (data.count("command") ? data["command"].s() : NO_SUCH_COMMAND); + std::string arguments = (data.count("arguments") ? data["arguments"].s() : EMPTY_STRING); + std::string session = (data.count("session") ? data["session"].s() : NULL_STRING); + + if (auto itor = commands.find(command); itor != commands.end()) { + auto handler = itor->second; + return crow::response{handler.exec(arguments, session)}; + } + + return crow::response{"no such command!\n"}; }); app.port(18080).multithreaded().run(); - std::cout << "Hello, World\n" << std::endl; + std::cout << "Stopped successfully" << std::endl; +} + +std::string klingerHandler(std::string const &arguments, std::string const &session, void *payload) { + return "Bonjour!"; +} + +std::string stopHandler(std::string const &arguments, std::string const &session, void *payload) { + auto app = (crow::SimpleApp*) payload; + app->stop(); + return "stopped"; } -// curl -d '{"a":"5", "b":"12"}' -H "Content-Type: application/json" -X POST http://localhost:18080/add_json +// curl -d '{"command":"klinger", "b":"12"}' -H "Content-Type: application/json" -X POST http://localhost:18080/ -- cgit v1.2.3-54-g00ecf