diff options
author | Jesse Luehrs <doy@tozt.net> | 2019-10-14 15:41:17 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2019-10-14 15:41:17 -0400 |
commit | 5a70afbad3d0085eb08a85630eb7aa0aa24af64a (patch) | |
tree | 7ad775c598b1cf228f3a5b7136281f1dc5bf08b2 | |
parent | ec976fe91259b9950980b0c35fb655a1dd99e97f (diff) | |
download | teleterm-5a70afbad3d0085eb08a85630eb7aa0aa24af64a.tar.gz teleterm-5a70afbad3d0085eb08a85630eb7aa0aa24af64a.zip |
simplify state management a bit
-rw-r--r-- | src/server.rs | 57 | ||||
-rw-r--r-- | src/term.rs | 2 |
2 files changed, 32 insertions, 27 deletions
diff --git a/src/server.rs b/src/server.rs index 55346a2..ca1c8e3 100644 --- a/src/server.rs +++ b/src/server.rs @@ -40,6 +40,7 @@ struct TerminalInfo { size: crate::term::Size, } +#[derive(Debug, Clone)] // XXX https://github.com/rust-lang/rust/issues/64362 #[allow(dead_code)] enum ConnectionState { @@ -75,48 +76,53 @@ impl ConnectionState { } fn login( - &self, + &mut self, username: &str, term_type: &str, size: &crate::term::Size, - ) -> Self { - match self { - Self::Accepted => Self::LoggedIn { + ) { + if let Self::Accepted = self { + *self = Self::LoggedIn { username: username.to_string(), term_info: TerminalInfo { term: term_type.to_string(), size: size.clone(), }, - }, - _ => unreachable!(), + }; + } else { + unreachable!() } } - fn stream(&self, buffer_size: usize) -> Self { - match self { - Self::LoggedIn { + fn stream(&mut self, buffer_size: usize) { + if let Self::LoggedIn { + username, + term_info, + } = std::mem::replace(self, Self::Accepted) + { + *self = Self::Streaming { username, term_info, - } => Self::Streaming { - username: username.clone(), - term_info: term_info.clone(), saved_data: crate::term::Buffer::new(buffer_size), - }, - _ => unreachable!(), + }; + } else { + unreachable!() } } - fn watch(&self, id: &str) -> Self { - match self { - Self::LoggedIn { + fn watch(&mut self, id: &str) { + if let Self::LoggedIn { + username, + term_info, + } = std::mem::replace(self, Self::Accepted) + { + *self = Self::Watching { username, term_info, - } => Self::Watching { - username: username.clone(), - term_info: term_info.clone(), watch_id: id.to_string(), - }, - _ => unreachable!(), + }; + } else { + unreachable!() } } } @@ -261,8 +267,7 @@ impl<S: tokio::io::AsyncRead + tokio::io::AsyncWrite + Send + 'static> match auth { crate::protocol::Auth::Plain { username } => { log::info!("{}: login({})", conn.id, username); - conn.state = - conn.state.login(&username, &term_type, &size); + conn.state.login(&username, &term_type, &size); } } Ok(()) @@ -306,13 +311,13 @@ impl<S: tokio::io::AsyncRead + tokio::io::AsyncWrite + Send + 'static> } crate::protocol::Message::StartStreaming => { log::info!("{}: stream({})", conn.id, username); - conn.state = conn.state.stream(self.buffer_size); + conn.state.stream(self.buffer_size); Ok(()) } crate::protocol::Message::StartWatching { id } => { if let Some(stream_conn) = self.connections.get(&id) { log::info!("{}: watch({}, {})", conn.id, username, id); - conn.state = conn.state.watch(&id); + conn.state.watch(&id); let data = if let ConnectionState::Streaming { saved_data, .. diff --git a/src/term.rs b/src/term.rs index 1d3fec0..ba6efdd 100644 --- a/src/term.rs +++ b/src/term.rs @@ -42,7 +42,7 @@ impl std::fmt::Display for Size { } } -#[derive(Debug, Default)] +#[derive(Debug, Clone, Default)] pub struct Buffer { max_size: usize, contents: Vec<u8>, |