From f7c5e6d380a6125534e900931f710109e863b892 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sun, 24 Nov 2019 12:55:25 -0500 Subject: simplify the update logic a bit --- teleterm-web/src/lib.rs | 6 ++-- teleterm-web/src/model.rs | 81 ++++++++++++++++++++++------------------------- 2 files changed, 41 insertions(+), 46 deletions(-) (limited to 'teleterm-web') diff --git a/teleterm-web/src/lib.rs b/teleterm-web/src/lib.rs index 4c2e366..eb87c44 100644 --- a/teleterm-web/src/lib.rs +++ b/teleterm-web/src/lib.rs @@ -10,10 +10,10 @@ use crate::prelude::*; #[allow(clippy::large_enum_variant)] #[derive(Clone)] enum Msg { - Login, + Login(String), LoggedIn(seed::fetch::ResponseDataResult<()>), - List(seed::fetch::ResponseDataResult>), Refresh, + List(seed::fetch::ResponseDataResult>), StartWatching(String), Watch(String, crate::ws::WebSocketEvent), StopWatching, @@ -21,7 +21,7 @@ enum Msg { fn init(_: Url, orders: &mut impl Orders) -> Init { log::trace!("init"); - orders.send_msg(Msg::Login); + orders.send_msg(Msg::Login("foo".to_string())); Init::new(crate::model::Model::new(crate::config::Config::load())) } diff --git a/teleterm-web/src/model.rs b/teleterm-web/src/model.rs index 90c07a0..68676b8 100644 --- a/teleterm-web/src/model.rs +++ b/teleterm-web/src/model.rs @@ -6,6 +6,16 @@ struct WatchConn { received_data: bool, } +impl WatchConn { + fn new(ws: WebSocket) -> Self { + Self { + ws, + term: vt100::Parser::default(), + received_data: false, + } + } +} + impl Drop for WatchConn { fn drop(&mut self) { self.ws.close().unwrap(); @@ -38,39 +48,27 @@ impl Model { orders: &mut impl Orders, ) { match msg { - crate::Msg::Login => { - log::debug!("logging in"); - let url = format!( - "http://{}/login?username=foo", - self.config.public_address - ); - orders.perform_cmd( - seed::Request::new(url) - .fetch_json_data(crate::Msg::LoggedIn), - ); + crate::Msg::Login(username) => { + log::debug!("login"); + self.login(&username, orders); } crate::Msg::LoggedIn(..) => { log::debug!("logged in"); - self.state = State::List(vec![]); orders.send_msg(crate::Msg::Refresh); } + crate::Msg::Refresh => { + log::debug!("refreshing"); + self.list(orders); + } crate::Msg::List(sessions) => match sessions { Ok(sessions) => { log::debug!("got sessions"); - self.update_sessions(sessions); + self.state = State::List(sessions); } Err(e) => { log::error!("error getting sessions: {:?}", e); } }, - crate::Msg::Refresh => { - log::debug!("refreshing"); - let url = - format!("http://{}/list", self.config.public_address); - orders.perform_cmd( - seed::Request::new(url).fetch_json_data(crate::Msg::List), - ); - } crate::Msg::StartWatching(id) => { log::debug!("watching {}", id); self.watch(&id, orders); @@ -92,8 +90,7 @@ impl Model { self.process(&data); } crate::protocol::Message::Disconnected => { - self.disconnect_watch(); - orders.send_msg(crate::Msg::Refresh); + self.list(orders); } crate::protocol::Message::Resize { size } => { self.set_size(size.rows, size.cols); @@ -105,8 +102,7 @@ impl Model { } }, crate::Msg::StopWatching => { - self.disconnect_watch(); - orders.send_msg(crate::Msg::Refresh); + self.list(orders); } } } @@ -155,29 +151,28 @@ impl Model { } } - fn watch(&mut self, id: &str, orders: &mut impl Orders) { - let url = - format!("ws://{}/watch?id={}", self.config.public_address, id); - let ws = crate::ws::connect(&url, id, crate::Msg::Watch, orders); - let term = vt100::Parser::default(); - self.state = State::Watch(WatchConn { - ws, - term, - received_data: false, - }) + fn login(&self, username: &str, orders: &mut impl Orders) { + let url = format!( + "http://{}/login?username={}", + self.config.public_address, username + ); + orders.perform_cmd( + seed::Request::new(url).fetch_json_data(crate::Msg::LoggedIn), + ); } - fn update_sessions( - &mut self, - new_sessions: Vec, - ) { - if let State::List(ref mut sessions) = self.state { - *sessions = new_sessions; - } + fn list(&self, orders: &mut impl Orders) { + let url = format!("http://{}/list", self.config.public_address); + orders.perform_cmd( + seed::Request::new(url).fetch_json_data(crate::Msg::List), + ); } - fn disconnect_watch(&mut self) { - self.state = State::List(vec![]) + fn watch(&mut self, id: &str, orders: &mut impl Orders) { + let url = + format!("ws://{}/watch?id={}", self.config.public_address, id); + let ws = crate::ws::connect(&url, id, crate::Msg::Watch, orders); + self.state = State::Watch(WatchConn::new(ws)); } fn process(&mut self, bytes: &[u8]) { -- cgit v1.2.3-54-g00ecf