diff options
| author | Eskil Queseth <eskilq@kth.se> | 2020-10-15 22:09:57 +0200 |
|---|---|---|
| committer | Eskil Queseth <eskilq@kth.se> | 2020-10-15 22:09:57 +0200 |
| commit | cfc0ab78a893d6a16d2eedfef290c9e1496a23e1 (patch) | |
| tree | 0ed06065cb937af22ad48a14d49dd1b0035a90b2 /mumd/src/state.rs | |
| parent | 01b3c75420ec5bf9083dbcf643d3c6087d4f2ce7 (diff) | |
| download | mum-cfc0ab78a893d6a16d2eedfef290c9e1496a23e1.tar.gz | |
add basic error messaging on mumd
Diffstat (limited to 'mumd/src/state.rs')
| -rw-r--r-- | mumd/src/state.rs | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/mumd/src/state.rs b/mumd/src/state.rs index 0fd814c..0b3663d 100644 --- a/mumd/src/state.rs +++ b/mumd/src/state.rs @@ -9,6 +9,7 @@ use mumlib::command::{Command, CommandResponse}; use mumlib::state::Server; use std::net::ToSocketAddrs; use tokio::sync::{mpsc, watch}; +use mumlib::error::Error; #[derive(Clone, Debug, Eq, PartialEq)] pub enum StatePhase { @@ -50,12 +51,17 @@ impl State { pub async fn handle_command( &mut self, command: Command, - ) -> (bool, Result<Option<CommandResponse>, ()>) { + ) -> (bool, mumlib::error::Result<Option<CommandResponse>>) { match command { Command::ChannelJoin { channel_id } => { if !matches!(*self.phase_receiver().borrow(), StatePhase::Connected) { warn!("Not connected"); - return (false, Err(())); + return (false, Err(Error::DisconnectedError)); + } + if let Some(server) = &self.server { + if !server.channels().contains_key(&channel_id) { + return (false, Err(Error::InvalidChannelIdError)); + } } let mut msg = msgs::UserState::new(); msg.set_session(self.session_id.unwrap()); @@ -66,7 +72,7 @@ impl State { Command::ChannelList => { if !matches!(*self.phase_receiver().borrow(), StatePhase::Connected) { warn!("Not connected"); - return (false, Err(())); + return (false, Err(Error::DisconnectedError)); } ( false, @@ -83,7 +89,7 @@ impl State { } => { if !matches!(*self.phase_receiver().borrow(), StatePhase::Disconnected) { warn!("Tried to connect to a server while already connected"); - return (false, Err(())); + return (false, Err(Error::AlreadyConnectedError)); } self.server = Some(Server::new()); self.username = Some(username); @@ -91,11 +97,14 @@ impl State { .0 .broadcast(StatePhase::Connecting) .unwrap(); - let socket_addr = (host.as_ref(), port) - .to_socket_addrs() - .expect("Failed to parse server address") - .next() - .expect("Failed to resolve server address"); + + let socket_addr = match (host.as_ref(), port).to_socket_addrs().map(|mut e| e.next()) { + Ok(Some(v)) => v, + _ => { + warn!("Error parsing server addr"); + return (false, Err(Error::InvalidServerAddrError)); + } + }; self.connection_info_sender .broadcast(Some(ConnectionInfo::new( socket_addr, @@ -108,13 +117,13 @@ impl State { Command::Status => { if !matches!(*self.phase_receiver().borrow(), StatePhase::Connected) { warn!("Not connected"); - return (false, Err(())); + return (false, Err(Error::DisconnectedError)); } ( false, Ok(Some(CommandResponse::Status { username: self.username.clone(), - server_state: self.server.clone().unwrap(), + server_state: self.server.clone().unwrap(), //guaranteed not to panic because if we are connected, server is guaranteed to be Some })), ) } |
