aboutsummaryrefslogtreecommitdiffstats
path: root/mumd/src/command.rs
diff options
context:
space:
mode:
authorEskil Queseth <eskilq@kth.se>2020-10-21 01:53:38 +0200
committerEskil Queseth <eskilq@kth.se>2020-10-21 04:20:05 +0200
commit46a53f38cde86439a2ca8b6d24887f842530f679 (patch)
treeab820e232149ea437497aa1cdd3463dc244fcdff /mumd/src/command.rs
parent685eb0ebb072ce2f3da562e828a6ab89c2b0fa65 (diff)
downloadmum-46a53f38cde86439a2ca8b6d24887f842530f679.tar.gz
add tcp event system
Diffstat (limited to 'mumd/src/command.rs')
-rw-r--r--mumd/src/command.rs38
1 files changed, 21 insertions, 17 deletions
diff --git a/mumd/src/command.rs b/mumd/src/command.rs
index a035a26..5285a9d 100644
--- a/mumd/src/command.rs
+++ b/mumd/src/command.rs
@@ -1,10 +1,11 @@
-use crate::state::{State, StatePhase};
+use crate::state::State;
use ipc_channel::ipc::IpcSender;
use log::*;
use mumlib::command::{Command, CommandResponse};
use std::sync::{Arc, Mutex};
-use tokio::sync::mpsc;
+use tokio::sync::{mpsc, oneshot};
+use crate::network::tcp::{TcpEvent, TcpEventCallback};
pub async fn handle(
state: Arc<Mutex<State>>,
@@ -12,23 +13,26 @@ pub async fn handle(
Command,
IpcSender<mumlib::error::Result<Option<CommandResponse>>>,
)>,
+ tcp_event_register_sender: mpsc::UnboundedSender<(TcpEvent, TcpEventCallback)>,
) {
debug!("Begin listening for commands");
- while let Some(command) = command_receiver.recv().await {
- debug!("Received command {:?}", command.0);
- let mut state = state.lock().unwrap();
- let (wait_for_connected, command_response) = state.handle_command(command.0).await;
- if wait_for_connected {
- let mut watcher = state.phase_receiver();
- drop(state);
- while !matches!(watcher.recv().await.unwrap(), StatePhase::Connected) {}
+ while let Some((command, response_sender)) = command_receiver.recv().await {
+ debug!("Received command {:?}", command);
+ let mut statee = state.lock().unwrap();
+ let (event_data, command_response) = statee.handle_command(command).await;
+ drop(statee);
+ if let Some((event, callback)) = event_data {
+ let (tx, rx) = oneshot::channel();
+ tcp_event_register_sender.send((event, Box::new(move |e| {
+ println!("något hände");
+ callback(e);
+ response_sender.send(command_response).unwrap();
+ tx.send(());
+ })));
+
+ rx.await;
+ } else {
+ response_sender.send(command_response).unwrap();
}
- command.1.send(command_response).unwrap();
}
- //TODO err if not connected
- //while let Some(command) = command_receiver.recv().await {
- // debug!("Parsing command {:?}", command);
- //}
-
- //debug!("Finished handling commands");
}