aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-10-14 15:41:17 -0400
committerJesse Luehrs <doy@tozt.net>2019-10-14 15:41:17 -0400
commit5a70afbad3d0085eb08a85630eb7aa0aa24af64a (patch)
tree7ad775c598b1cf228f3a5b7136281f1dc5bf08b2
parentec976fe91259b9950980b0c35fb655a1dd99e97f (diff)
downloadteleterm-5a70afbad3d0085eb08a85630eb7aa0aa24af64a.tar.gz
teleterm-5a70afbad3d0085eb08a85630eb7aa0aa24af64a.zip
simplify state management a bit
-rw-r--r--src/server.rs57
-rw-r--r--src/term.rs2
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>,