aboutsummaryrefslogtreecommitdiff
path: root/src/commander.cpp
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2018-12-01 19:03:33 +0100
committerFelix Morgner <felix.morgner@gmail.com>2018-12-01 19:03:33 +0100
commit2be129ac64d2540dc42f89bac85d24d4557aa59f (patch)
tree1df65973d162a1c36ab75c06b7101a81285160ea /src/commander.cpp
parent927caf94ad0d7b98d4b2c3833da8f0f2707d4f87 (diff)
downloadwanda-2be129ac64d2540dc42f89bac85d24d4557aa59f.tar.xz
wanda-2be129ac64d2540dc42f89bac85d24d4557aa59f.zip
wandac: implement very basic command line interface
Diffstat (limited to 'src/commander.cpp')
-rw-r--r--src/commander.cpp50
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) + '\'');
}
}