From 5eabab2e437054787a70dcef59f0b06de0c42659 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Fri, 22 Nov 2019 03:29:12 -0500 Subject: refactor --- teleterm-web/src/lib.rs | 60 ++++++++++++--------------------------------- teleterm-web/src/model.rs | 62 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 45 deletions(-) create mode 100644 teleterm-web/src/model.rs (limited to 'teleterm-web') diff --git a/teleterm-web/src/lib.rs b/teleterm-web/src/lib.rs index c78c600..5c7d5c1 100644 --- a/teleterm-web/src/lib.rs +++ b/teleterm-web/src/lib.rs @@ -1,3 +1,4 @@ +mod model; mod prelude; mod ws; @@ -9,64 +10,33 @@ extern "C" { fn log(s: &str); } -const LIST_URL: &str = "http://127.0.0.1:4145/list"; -const WATCH_URL: &str = "ws://127.0.0.1:4145/watch"; - #[allow(clippy::large_enum_variant)] #[derive(Clone)] enum Msg { - List(seed::fetch::ResponseDataResult>), + List(seed::fetch::ResponseDataResult>), Refresh, StartWatching(String), Watch(ws::WebSocketEvent), } -struct WatchConn { - id: String, - #[allow(dead_code)] // no idea why it thinks this is dead - ws: WebSocket, -} - -#[derive(Clone, Debug, serde::Deserialize)] -struct Session { - id: String, - username: String, -} - -#[derive(Default)] -struct Model { - sessions: Vec, - watch_conn: Option, -} - -impl Model { - fn list(&self) -> impl futures::Future { - seed::Request::new(LIST_URL).fetch_json_data(Msg::List) - } - - fn watch(&mut self, id: &str, orders: &mut impl Orders) { - let ws = ws::connect(WATCH_URL, Msg::Watch, orders); - self.watch_conn = Some(WatchConn { - id: id.to_string(), - ws, - }) - } -} - -fn init(_: Url, orders: &mut impl Orders) -> Init { +fn init(_: Url, orders: &mut impl Orders) -> Init { log("init"); - let model = Model::default(); + let model = crate::model::Model::default(); orders.perform_cmd(model.list()); Init::new(model) } -fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) { +fn update( + msg: Msg, + model: &mut crate::model::Model, + orders: &mut impl Orders, +) { log("update"); match msg { Msg::List(sessions) => match sessions { Ok(sessions) => { log("got sessions"); - model.sessions = sessions; + model.update_sessions(sessions); } Err(e) => { log(&format!("error getting sessions: {:?}", e)); @@ -85,19 +55,19 @@ fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) { } ws::WebSocketEvent::Disconnected(_) => { log("disconnected"); - model.watch_conn = None; + model.watch_disconnect(); } ws::WebSocketEvent::Message(msg) => { log(&format!( "message from id {}: {:?}", - model.watch_conn.as_ref().unwrap().id, + model.watch_id().unwrap(), msg )); } ws::WebSocketEvent::Error(e) => { log(&format!( "error from id {}: {:?}", - model.watch_conn.as_ref().unwrap().id, + model.watch_id().unwrap(), e )); } @@ -105,10 +75,10 @@ fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) { } } -fn view(model: &Model) -> impl View { +fn view(model: &crate::model::Model) -> impl View { log("view"); let mut list = vec![]; - for session in &model.sessions { + for session in model.sessions() { list.push(seed::li![seed::button![ simple_ev(Ev::Click, Msg::StartWatching(session.id.clone())), format!("{}: {}", session.username, session.id), diff --git a/teleterm-web/src/model.rs b/teleterm-web/src/model.rs new file mode 100644 index 0000000..9f7ab05 --- /dev/null +++ b/teleterm-web/src/model.rs @@ -0,0 +1,62 @@ +use crate::prelude::*; + +const LIST_URL: &str = "http://127.0.0.1:4145/list"; +const WATCH_URL: &str = "ws://127.0.0.1:4145/watch"; + +struct WatchConn { + id: String, + #[allow(dead_code)] // no idea why it thinks this is dead + ws: WebSocket, +} + +#[derive(Clone, Debug, serde::Deserialize)] +pub struct Session { + pub id: String, + pub username: String, +} + +#[derive(Default)] +pub struct Model { + sessions: Vec, + watch_conn: Option, +} + +impl Model { + pub(crate) fn list( + &self, + ) -> impl futures::Future { + seed::Request::new(LIST_URL).fetch_json_data(crate::Msg::List) + } + + pub(crate) fn watch( + &mut self, + id: &str, + orders: &mut impl Orders, + ) { + let ws = crate::ws::connect(WATCH_URL, crate::Msg::Watch, orders); + self.watch_conn = Some(WatchConn { + id: id.to_string(), + ws, + }) + } + + pub fn sessions(&self) -> &[Session] { + &self.sessions + } + + pub fn update_sessions(&mut self, sessions: Vec) { + self.sessions = sessions; + } + + pub fn watch_id(&self) -> Option<&str> { + if let Some(conn) = &self.watch_conn { + Some(&conn.id) + } else { + None + } + } + + pub fn watch_disconnect(&mut self) { + self.watch_conn = None; + } +} -- cgit v1.2.3-54-g00ecf