aboutsummaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2023-09-07 15:41:09 +0200
committerFelix Morgner <felix.morgner@gmail.com>2023-09-07 15:41:09 +0200
commitbbda83f674a97e80cf89bff3d12737dd5ecc3243 (patch)
treeb37a1c465eaa2f999fdde87547a44caaf8ff97e1 /source
parent8e48049013a5a6668d2bd3c1bcb1fbc0ddd9534d (diff)
downloadwanda-bbda83f674a97e80cf89bff3d12737dd5ecc3243.tar.xz
wanda-bbda83f674a97e80cf89bff3d12737dd5ecc3243.zip
wandac: extract cli and commander listener
Diffstat (limited to 'source')
-rw-r--r--source/.clang-format5
-rw-r--r--source/app/wandac/CMakeLists.txt6
-rw-r--r--source/app/wandac/include/wandac/cli.hpp27
-rw-r--r--source/app/wandac/include/wandac/listener.hpp26
-rw-r--r--source/app/wandac/src/cli.cpp30
-rw-r--r--source/app/wandac/src/listener.cpp30
-rw-r--r--source/app/wandac/src/main.cpp70
7 files changed, 133 insertions, 61 deletions
diff --git a/source/.clang-format b/source/.clang-format
index a1b0b91..b5fcb07 100644
--- a/source/.clang-format
+++ b/source/.clang-format
@@ -41,8 +41,11 @@ FixNamespaceComments: 'true'
IncludeBlocks: Regroup
IncludeCategories:
# Local Headers
- - Regex: '(<|")wanda/.+\.hpp(>|")'
+ - Regex: '"wanda[cd]?/.+\.hpp"'
Priority: 100
+ # Local Headers
+ - Regex: '<wanda[cd]?/.+\.hpp>'
+ Priority: 110
# STL Headers
- Regex: '<[[:alnum:]._]+(?!\.(h|hpp))>'
Priority: 400
diff --git a/source/app/wandac/CMakeLists.txt b/source/app/wandac/CMakeLists.txt
index 43740d1..0a70e5b 100644
--- a/source/app/wandac/CMakeLists.txt
+++ b/source/app/wandac/CMakeLists.txt
@@ -1,7 +1,13 @@
add_executable("wandac"
+ "src/cli.cpp"
+ "src/listener.cpp"
"src/main.cpp"
)
+target_include_directories("${PROJECT_NAME}c" PRIVATE
+ "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
+)
+
target_link_libraries("${PROJECT_NAME}c" PRIVATE
"wanda::control"
"wanda::proto"
diff --git a/source/app/wandac/include/wandac/cli.hpp b/source/app/wandac/include/wandac/cli.hpp
new file mode 100644
index 0000000..c04b138
--- /dev/null
+++ b/source/app/wandac/include/wandac/cli.hpp
@@ -0,0 +1,27 @@
+#ifndef WANDA_APP_WANDAC_CLI_HPP
+#define WANDA_APP_WANDAC_CLI_HPP
+
+#include <lyra/args.hpp>
+#include <lyra/cli_parser.hpp>
+
+#include <iosfwd>
+#include <string>
+
+namespace wandac
+{
+
+ struct cli
+ {
+ auto parse(lyra::args arguments, std::ostream & error_stream) -> bool;
+ auto print_usage(std::ostream & output_stream) -> void;
+
+ std::string command{};
+ bool help{};
+
+ private:
+ lyra::cli_parser parser{};
+ };
+
+} // namespace wandac
+
+#endif \ No newline at end of file
diff --git a/source/app/wandac/include/wandac/listener.hpp b/source/app/wandac/include/wandac/listener.hpp
new file mode 100644
index 0000000..49b75b6
--- /dev/null
+++ b/source/app/wandac/include/wandac/listener.hpp
@@ -0,0 +1,26 @@
+#ifndef WANDA_APP_WANDAC_LISTENER_HPP
+#define WANDA_APP_WANDAC_LISTENER_HPP
+
+#include "wandac/cli.hpp"
+
+#include <wanda/control/commander.hpp>
+
+#include <boost/asio/io_context.hpp>
+
+namespace wandac
+{
+
+ struct listener : wanda::control::commander::listener
+ {
+ listener(wandac::cli const & cli, boost::asio::io_context & service);
+
+ auto on_connected(wanda::control::commander & commander) -> void override ;
+
+ private:
+ wandac::cli const & m_cli;
+ boost::asio::io_context & m_service;
+ };
+
+} // namespace wandac
+
+#endif \ No newline at end of file
diff --git a/source/app/wandac/src/cli.cpp b/source/app/wandac/src/cli.cpp
new file mode 100644
index 0000000..954ca63
--- /dev/null
+++ b/source/app/wandac/src/cli.cpp
@@ -0,0 +1,30 @@
+#include "wandac/cli.hpp"
+
+#include <lyra/arg.hpp>
+#include <lyra/help.hpp>
+
+#include <ostream>
+
+namespace wandac
+{
+
+ auto cli::parse(lyra::args arguments, std::ostream & error_stream) -> bool
+ {
+ parser |= //
+ lyra::help(help) | //
+ lyra::arg{command, "command"}("The command to send to the deamon").required();
+
+ auto result = parser.parse(arguments);
+
+ if (!result)
+ {
+ error_stream << "Error while processing command line arguments: " << result.message() << '\n' << parser << '\n';
+ return false;
+ }
+
+ return true;
+ }
+
+ auto cli::print_usage(std::ostream & output_stream) -> void { output_stream << parser << '\n'; }
+
+} // namespace wandac
diff --git a/source/app/wandac/src/listener.cpp b/source/app/wandac/src/listener.cpp
new file mode 100644
index 0000000..9655390
--- /dev/null
+++ b/source/app/wandac/src/listener.cpp
@@ -0,0 +1,30 @@
+#include "wandac/listener.hpp"
+
+#include "wanda/control/commander.hpp"
+#include "wandac/cli.hpp"
+
+#include <wanda/control/commander.hpp>
+#include <wanda/proto/command.hpp>
+
+#include <boost/asio/io_context.hpp>
+
+namespace wandac
+{
+
+ listener::listener(wandac::cli const & cli, boost::asio::io_context & service)
+ : m_cli{cli}
+ , m_service{service}
+ {
+ }
+
+ auto listener::on_connected(wanda::control::commander & commander) -> void
+ {
+ if (m_cli.command == "change")
+ {
+ commander.send(wanda::proto::make_change_command());
+
+ post(m_service, [&] { commander.stop(); });
+ }
+ }
+
+} // namespace wandac
diff --git a/source/app/wandac/src/main.cpp b/source/app/wandac/src/main.cpp
index 65af1db..4e68e0b 100644
--- a/source/app/wandac/src/main.cpp
+++ b/source/app/wandac/src/main.cpp
@@ -1,88 +1,38 @@
+#include "wandac/cli.hpp"
+#include "wandac/listener.hpp"
+
#include <wanda/control/commander.hpp>
-#include <wanda/proto/command.hpp>
#include <wanda/system/environment.hpp>
#include <wanda/system/logging.hpp>
#include <wanda/system/xdg.hpp>
#include <boost/asio/io_context.hpp>
-#include <boost/asio/post.hpp>
-#include <lyra/lyra.hpp>
#include <spdlog/sinks/stdout_color_sinks.h>
-#include <spdlog/spdlog.h>
#include <cstdlib>
#include <filesystem>
#include <iostream>
-#include <memory>
-
-struct cli
-{
- std::string command{};
- bool help{};
-
- lyra::cli_parser parser{};
-
- auto parse(int argc, char const * const * argv, std::ostream & error)
- {
- parser |= //
- lyra::help(help) | //
- lyra::arg{command, "command"}("The command to send to the deamon").required();
-
- auto result = parser.parse({argc, argv});
-
- if (!result)
- {
- error << "Error while processing command line arguments: " << result.message() << '\n' << parser << '\n';
- return false;
- }
-
- return true;
- }
-};
-
-struct listener : wanda::control::commander::listener
-{
- listener(::cli & cli, boost::asio::io_context & service)
- : m_cli{cli}
- , m_service{service}
- {
- }
-
- void on_connected(wanda::control::commander & commander) override
- {
- if (m_cli.command == "change")
- {
- commander.send(wanda::proto::make_change_command());
-
- post(m_service, [&] { commander.stop(); });
- }
- }
-
-private:
- ::cli & m_cli;
- boost::asio::io_context & m_service;
-};
int main(int argc, char const * const * argv)
{
- auto cli = ::cli{};
- if (!cli.parse(argc, argv, std::cerr))
+ auto cli = wandac::cli{};
+ if (!cli.parse({argc, argv}, std::cerr))
{
return EXIT_FAILURE;
}
else if (cli.help)
{
- std::cout << cli.parser << '\n';
+ cli.print_usage(std::cout);
return EXIT_SUCCESS;
}
wanda::system::initialize_logger(std::make_shared<spdlog::sinks::stderr_color_sink_st>());
- auto interface =
- wanda::system::xdg_path_for(wanda::system::xdg_directory::runtime_dir, wanda::system::environment{}) /
- ".wanda_interface";
+ auto environment = wanda::system::environment{};
+ auto runtime_dir = wanda::system::xdg_path_for(wanda::system::xdg_directory::runtime_dir, environment);
+ auto interface = runtime_dir / ".wanda_interface";
auto service = boost::asio::io_context{};
- auto listener = ::listener{cli, service};
+ auto listener = wandac::listener{cli, service};
auto commander = wanda::control::commander{service, interface, listener};