aboutsummaryrefslogtreecommitdiff
path: root/src/commander.cpp
diff options
context:
space:
mode:
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) + '\'');
}
}