From 85aa51328a8da4935f8a94f6e8f4049d13c2b47d Mon Sep 17 00:00:00 2001 From: jD91mZM2 Date: Thu, 7 Jun 2018 18:04:59 +0200 Subject: [PATCH] Slightly improve code for requiring listener/client --- src/scheme.rs | 45 ++++++++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/src/scheme.rs b/src/scheme.rs index 8ab8a7b690..57e62b876a 100644 --- a/src/scheme.rs +++ b/src/scheme.rs @@ -54,11 +54,16 @@ impl Handle { ..Default::default() } } - pub fn is_listener(&self) -> bool { - if let Extra::Listener(_) = self.extra { - true - } else { - false + pub fn require_listener(&self) -> Result<()> { + match self.extra { + Extra::Listener(_) => Ok(()), + _ => Err(Error::new(EBADF)) + } + } + pub fn require_client(&self) -> Result<()> { + match self.extra { + Extra::Client(_) => Ok(()), + _ => Err(Error::new(EBADF)) } } } @@ -138,9 +143,10 @@ impl SchemeBlockMut for IpcScheme { fn dup(&mut self, id: usize, buf: &[u8]) -> Result> { match buf { b"listen" => { - let (flags, remote) = match self.handles.get(&id) { - Some(ref handle) if handle.is_listener() => (handle.flags, handle.remote), - _ => return Err(Error::new(EBADF)) + let (flags, remote) = { + let handle = self.handles.get(&id).ok_or(Error::new(EBADF))?; + handle.require_listener()?; + (handle.flags, handle.remote) }; if let Connection::Open(remote) = remote { let new_id = self.next_id; @@ -167,14 +173,14 @@ impl SchemeBlockMut for IpcScheme { let mut new = Handle::default(); let new_id = self.next_id; - match self.handles.get_mut(&id) { - Some(ref mut handle) if handle.is_listener() => { - if handle.remote != Connection::Waiting { - return Err(Error::new(ECONNREFUSED)); - } - handle.remote = Connection::Open(new_id); - }, - _ => return Err(Error::new(EBADF)) + { + let handle = self.handles.get_mut(&id).ok_or(Error::new(EBADF))?; + handle.require_listener()?; + + if handle.remote != Connection::Waiting { + return Err(Error::new(ECONNREFUSED)); + } + handle.remote = Connection::Open(new_id); } self.handles.insert(new_id, new); @@ -204,9 +210,10 @@ impl SchemeBlockMut for IpcScheme { Ok(Some(id)) } fn write(&mut self, id: usize, buf: &[u8]) -> Result> { - let (flags, remote) = match self.handles.get(&id) { - Some(handle) if !handle.is_listener() => (handle.flags, handle.remote), - _ => return Err(Error::new(EBADF)) + let (flags, remote) = { + let handle = self.handles.get(&id).ok_or(Error::new(EBADF))?; + handle.require_client()?; + (handle.flags, handle.remote) }; if let Connection::Open(remote) = remote { let mut remote = self.handles.get_mut(&remote).unwrap();