diff options
Diffstat (limited to 'src/commander.cpp')
| -rw-r--r-- | src/commander.cpp | 50 |
1 files changed, 49 insertions, 1 deletions
diff --git a/src/commander.cpp b/src/commander.cpp index 6cb1996..21bf4f5 100644 --- a/src/commander.cpp +++ b/src/commander.cpp @@ -1,14 +1,44 @@ #include "commander.hpp" #include "message.hpp" +#include "optional.hpp" #include <spdlog/fmt/ostr.h> namespace wanda { -commander::commander(asio::io_service &service, std::filesystem::path socket, std::shared_ptr<spdlog::logger> logger) + +std::optional<message> commander::command::message() const +{ + using namespace std::string_literals; + auto const command = [this] { + switch (id) + { + case command_id::change: + return "CHANGE"s; + default: + return ""s; + } + }(); + + auto argument_string = std::string{}; + for(int index = 0ul; index < arguments.size(); ++index) + { + argument_string += (index) ? "," + arguments[index] : arguments[index]; + } + + if(command.empty()) + { + return std::nullopt; + } + + return wanda::message{"C", command, argument_string}; +} + +commander::commander(asio::io_service &service, std::filesystem::path socket, listener &listener, std::shared_ptr<spdlog::logger> logger) : m_service{service}, m_endpoint{socket.string()}, m_socket{service}, + m_listener{listener}, m_logger{logger} { } @@ -31,6 +61,22 @@ void commander::start() }); } +void commander::send(command command) +{ + using namespace wanda::std_ext; + + if (!m_connection || m_connection->current_state() != control_connection::state::established) + { + m_logger->error("tried to send command without an established connection"); + m_listener.on_error(*this, "tried to send command without an established connection"); + return; + } + + with(command.message(), [&](auto const & message){ + m_connection->send(message); + }) || [&]{ m_logger->error("unknown command"); }; +} + void commander::on_error(control_connection::pointer connection, std::error_code error) { m_logger->error("control interface communication error: '{}'", error.message()); @@ -42,10 +88,12 @@ void commander::on_received(wanda::control_connection::pointer connection, messa { m_logger->info("connection to wanda deamon successfully established"); connection->update(control_connection::state::established); + m_listener.on_connected(*this); } else { m_logger->error("unexpected message: '{}'", message); + m_listener.on_error(*this, "unexpected message '" + static_cast<std::string>(message) + '\''); } } |
