From 2be129ac64d2540dc42f89bac85d24d4557aa59f Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Sat, 1 Dec 2018 19:03:33 +0100 Subject: wandac: implement very basic command line interface --- src/commander.cpp | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) (limited to 'src/commander.cpp') 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 namespace wanda { -commander::commander(asio::io_service &service, std::filesystem::path socket, std::shared_ptr logger) + +std::optional 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 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(message) + '\''); } } -- cgit v1.2.3