From bbda83f674a97e80cf89bff3d12737dd5ecc3243 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Thu, 7 Sep 2023 15:41:09 +0200 Subject: wandac: extract cli and commander listener --- source/.clang-format | 5 +- source/app/wandac/CMakeLists.txt | 6 +++ source/app/wandac/include/wandac/cli.hpp | 27 +++++++++++ source/app/wandac/include/wandac/listener.hpp | 26 ++++++++++ source/app/wandac/src/cli.cpp | 30 ++++++++++++ source/app/wandac/src/listener.cpp | 30 ++++++++++++ source/app/wandac/src/main.cpp | 70 ++++----------------------- 7 files changed, 133 insertions(+), 61 deletions(-) create mode 100644 source/app/wandac/include/wandac/cli.hpp create mode 100644 source/app/wandac/include/wandac/listener.hpp create mode 100644 source/app/wandac/src/cli.cpp create mode 100644 source/app/wandac/src/listener.cpp 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: '' + 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 + "$" +) + 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 +#include + +#include +#include + +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 + +#include + +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 +#include + +#include + +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 +#include + +#include + +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 -#include #include #include #include #include -#include -#include #include -#include #include #include #include -#include - -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()); - 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}; -- cgit v1.2.3