diff options
| author | Eskil Queseth <eskilq@kth.se> | 2020-10-21 01:53:38 +0200 |
|---|---|---|
| committer | Eskil Queseth <eskilq@kth.se> | 2020-10-21 04:20:05 +0200 |
| commit | 46a53f38cde86439a2ca8b6d24887f842530f679 (patch) | |
| tree | ab820e232149ea437497aa1cdd3463dc244fcdff /mumd/src/command.rs | |
| parent | 685eb0ebb072ce2f3da562e828a6ab89c2b0fa65 (diff) | |
| download | mum-46a53f38cde86439a2ca8b6d24887f842530f679.tar.gz | |
add tcp event system
Diffstat (limited to 'mumd/src/command.rs')
| -rw-r--r-- | mumd/src/command.rs | 38 |
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"); } |
