aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/server/common
diff options
context:
space:
mode:
authorEgor Tensin <Egor.Tensin@gmail.com>2019-12-07 03:36:21 +0300
committerEgor Tensin <Egor.Tensin@gmail.com>2019-12-07 03:36:21 +0300
commit00863566ec4601c65c435b74e575d49546a1c707 (patch)
tree479a0a6e96aba8191c7a65ea9bee2f4d5e3a4aba /server/common
parentadd stress_test.py (diff)
downloadmath-server-00863566ec4601c65c435b74e575d49546a1c707.tar.gz
math-server-00863566ec4601c65c435b74e575d49546a1c707.zip
split server into multiple components
In a vague attempt to make header files more readable, split server/ into a number of components. Also, refactor the unit tests to use the "Data-driven test cases" of Boost.Test.
Diffstat (limited to 'server/common')
-rw-r--r--server/common/CMakeLists.txt6
-rw-r--r--server/common/error.hpp15
-rw-r--r--server/common/log.hpp49
3 files changed, 70 insertions, 0 deletions
diff --git a/server/common/CMakeLists.txt b/server/common/CMakeLists.txt
new file mode 100644
index 0000000..5655861
--- /dev/null
+++ b/server/common/CMakeLists.txt
@@ -0,0 +1,6 @@
+find_package(Boost REQUIRED)
+
+add_library(common INTERFACE)
+
+target_include_directories(common SYSTEM INTERFACE ${Boost_INCLUDE_DIRS})
+target_link_libraries(common INTERFACE ${Boost_LIBRARIES})
diff --git a/server/common/error.hpp b/server/common/error.hpp
new file mode 100644
index 0000000..cbfbb1e
--- /dev/null
+++ b/server/common/error.hpp
@@ -0,0 +1,15 @@
+#pragma once
+
+#include <stdexcept>
+#include <string>
+
+namespace math::server {
+
+class Error : public std::runtime_error {
+public:
+ explicit Error(const std::string& what)
+ : std::runtime_error{"server error: " + what}
+ { }
+};
+
+}
diff --git a/server/common/log.hpp b/server/common/log.hpp
new file mode 100644
index 0000000..ca0fafd
--- /dev/null
+++ b/server/common/log.hpp
@@ -0,0 +1,49 @@
+#pragma once
+
+#include <boost/format.hpp>
+#include <boost/system/error_code.hpp>
+
+#include <ctime>
+
+#include <iomanip>
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <string_view>
+#include <thread>
+#include <utility>
+
+namespace math::server::log {
+
+namespace details {
+
+inline std::thread::id get_tid() { return std::this_thread::get_id(); }
+
+inline std::string get_timestamp() {
+ const auto tt = std::time(nullptr);
+ std::ostringstream oss;
+ oss << std::put_time(std::gmtime(&tt), "%Y-%m-%d %H:%M:%S");
+ return oss.str();
+}
+
+inline void log(const std::string& msg) {
+ std::clog << get_timestamp() << " | " << get_tid() << " | " << msg << '\n';
+}
+
+}
+
+template <typename... Args>
+inline void log(const std::string_view& fmt, Args&&... args) {
+ details::log(boost::str((boost::format(fmt.data()) % ... % args)));
+}
+
+template <typename... Args>
+inline void error(const std::string_view& fmt, Args&&... args) {
+ details::log(boost::str((boost::format(fmt.data()) % ... % args)));
+}
+
+inline void error(const boost::system::error_code& ec) {
+ details::log(ec.message());
+}
+
+}