aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNiklas Halle <niklas@niklashalle.net>2020-08-26 17:19:19 +0200
committerNiklas Halle <niklas@niklashalle.net>2020-08-26 17:19:19 +0200
commitc5ea2cf0d741e7ced6bd32e4a013a21be3755394 (patch)
tree55e7da929f3956a90b12f67e45155a09824b949a
parent83572f021f3b23a9046f1988e6e0443ed6295df3 (diff)
downloadn_core-test/new_server.tar.gz
n_core-test/new_server.zip
more indirection always helps, right?test/new_server
-rw-r--r--include/Handler.hpp14
-rw-r--r--src/Handler.cpp14
-rw-r--r--src/SimpleHandlers.cpp2
-rw-r--r--src/main.cpp47
4 files changed, 40 insertions, 37 deletions
diff --git a/include/Handler.hpp b/include/Handler.hpp
index 7bbefcd..37f281c 100644
--- a/include/Handler.hpp
+++ b/include/Handler.hpp
@@ -11,19 +11,23 @@ namespace Handler {
typedef crow::json::wvalue json;
typedef std::function<json(std::string const &arguments, std::string const &session,
void *payload)> handler_function;
+ typedef std::function<std::vector<json>()> description_function;
struct CommandHandler {
- CommandHandler(std::string command, handler_function func, std::vector<json> *description,
- void *payload = nullptr);
+ CommandHandler(std::string command, handler_function func, description_function desc, void *payload = nullptr);
- CommandHandler(CommandHandler &&o) noexcept;
+ CommandHandler(CommandHandler &&o) noexcept {
+ command = std::move(o.command);
+ func = std::move(o.func);
+ get_description = std::move(get_description);
+ payload = o.payload;
+ };
[[nodiscard]] json exec(std::string const &arguments, std::string const &session) const;
std::string command;
handler_function func{nullptr};
- // handler does NOT take ownership of the description, you have to delete it - after this object is destroyed
- std::vector<json> *description{nullptr};
+ description_function get_description{nullptr};
void *payload{nullptr};
};
diff --git a/src/Handler.cpp b/src/Handler.cpp
index b5ed9f0..a26ee8a 100644
--- a/src/Handler.cpp
+++ b/src/Handler.cpp
@@ -15,18 +15,10 @@ std::vector<std::string> Handler::tokenizeArguments(const std::string &arguments
return tokens;
}
-Handler::CommandHandler::CommandHandler(Handler::CommandHandler &&o) noexcept {
- // this is a copy constructor, disguised as a move constructor.. I am sorry
- command = o.command;
- func = o.func;
- description = o.description; // this is the main problem, any "moved" object will point to the same description TODO: maybe smart pointer can help?
- payload = o.payload;
-}
-
Handler::json Handler::CommandHandler::exec(const std::string &arguments, const std::string &session) const {
return func(arguments, session, payload);
}
-Handler::CommandHandler::CommandHandler(std::string command, Handler::handler_function func,
- std::vector<json> *description, void *payload)
- : command{std::move(command)}, func{std::move(func)}, description{description}, payload{payload} {}
+Handler::CommandHandler::CommandHandler(std::string command, Handler::handler_function func, description_function desc,
+ void *payload)
+ : command{std::move(command)}, func{std::move(func)}, get_description{std::move(desc)}, payload{payload} {}
diff --git a/src/SimpleHandlers.cpp b/src/SimpleHandlers.cpp
index 5b68125..e4ce4ac 100644
--- a/src/SimpleHandlers.cpp
+++ b/src/SimpleHandlers.cpp
@@ -38,7 +38,7 @@ Handler::json Handler::helpHandler(std::string const &arguments, std::string con
std::vector<json> commandAnnotations;
commandAnnotations.emplace_back(
- create_annotation(Reply::AnnotationType::command, std::move(*itor.description)));
+ create_annotation(Reply::AnnotationType::command, std::move(itor.get_description())));
reply_vec.emplace_back(create_text("- "));
reply_vec.emplace_back(create_text(itor.command, std::move(commandAnnotations)));
diff --git a/src/main.cpp b/src/main.cpp
index fd1be31..8a8e4ba 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -12,39 +12,49 @@
#include "GetEssen.hpp"
#include "SimpleHandlers.hpp"
#include "RelationshipHandler.hpp"
+
/* END Handlers */
int main() {
crow::SimpleApp app;
- auto createPlainDescriptionFromText = [](std::string const &text) -> std::vector<crow::json::wvalue> * {
- auto reply_vector = new std::vector<crow::json::wvalue>;
- reply_vector->emplace_back(Response::create_text(text));
+ auto createPlainDescriptionFromText = [](std::string const &text) -> std::vector<crow::json::wvalue> {
+ std::vector<crow::json::wvalue> reply_vector;
+ reply_vector.emplace_back(Response::create_text(text));
return reply_vector;
};
// command --> handler
std::vector<Handler::CommandHandler> commands;
commands.emplace_back(
- Handler::CommandHandler{"wiki", Handler::wikiHandler, createPlainDescriptionFromText(
- "Sends you to Wikipedia!")});
+ Handler::CommandHandler{"wiki", Handler::wikiHandler, [createPlainDescriptionFromText]() {
+ return createPlainDescriptionFromText("Sends you to Wikipedia!");
+ }});
commands.emplace_back(
- Handler::CommandHandler{"stop", Handler::stopHandler, createPlainDescriptionFromText(
- "Stops the bot"), &app});
+ Handler::CommandHandler{"stop", Handler::stopHandler, [createPlainDescriptionFromText]() {
+ return createPlainDescriptionFromText("Stops the bot");
+ }, &app});
commands.emplace_back(
- Handler::CommandHandler{"mensa", Handler::mensaHandler, createPlainDescriptionFromText(
- "{adlershof, nord, sued} Shows the daily menu of the mensa at various places.")});
+ Handler::CommandHandler{"mensa", Handler::mensaHandler, [createPlainDescriptionFromText]() {
+ return createPlainDescriptionFromText(
+ "{adlershof, nord, sued} Shows the daily menu of the mensa at various places.");
+ }});
commands.emplace_back(
- Handler::CommandHandler{"klinger", Handler::klingerHandler, createPlainDescriptionFromText(
- "Greats in french. Bonjour!")});
+ Handler::CommandHandler{"klinger", Handler::klingerHandler, [createPlainDescriptionFromText]() {
+ return createPlainDescriptionFromText("Greats in french. Bonjour!");
+ }});
commands.emplace_back(
- Handler::CommandHandler{"say", Handler::sayHandler, createPlainDescriptionFromText(
- "Say something!")});
+ Handler::CommandHandler{"say", Handler::sayHandler, [createPlainDescriptionFromText]() {
+ return createPlainDescriptionFromText("Say something!");
+ }});
commands.emplace_back(
- Handler::CommandHandler{"relation", Handler::relationShipHandler, createPlainDescriptionFromText(
- "[name1] [name2] Shows the result of an odd astrological religious pseudo-algorithm, based on the fact how much blessing a relationship receives by the glorious N.")});
- commands.emplace_back(Handler::CommandHandler{"help", Handler::helpHandler, createPlainDescriptionFromText(
- "This is my holy manual."), &commands});
+ Handler::CommandHandler{"relation", Handler::relationShipHandler, [createPlainDescriptionFromText]() {
+ return createPlainDescriptionFromText(
+ "[name1] [name2] Shows the result of an odd astrological religious pseudo-algorithm, based on the fact how much blessing a relationship receives by the glorious N.");
+ }});
+ commands.emplace_back(Handler::CommandHandler{"help", Handler::helpHandler, [createPlainDescriptionFromText]() {
+ return createPlainDescriptionFromText("This is my holy manual.");
+ }, &commands});
CROW_ROUTE(app, "/")
.methods("POST"_method)
@@ -78,8 +88,5 @@ int main() {
app.port(18080).multithreaded().run();
- for (auto &&it : commands)
- delete it.description;
-
std::cout << "Stopped successfully" << std::endl;
}