aboutsummaryrefslogtreecommitdiffstats
path: root/teleterm-web
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-11-22 03:29:12 -0500
committerJesse Luehrs <doy@tozt.net>2019-11-22 03:29:12 -0500
commit5eabab2e437054787a70dcef59f0b06de0c42659 (patch)
tree6e15554ec9f6c122aa8f5740fd2c437dbea434cb /teleterm-web
parentd3fe70943c0957c977b44965fe300f6c1b101e32 (diff)
downloadteleterm-5eabab2e437054787a70dcef59f0b06de0c42659.tar.gz
teleterm-5eabab2e437054787a70dcef59f0b06de0c42659.zip
refactor
Diffstat (limited to 'teleterm-web')
-rw-r--r--teleterm-web/src/lib.rs60
-rw-r--r--teleterm-web/src/model.rs62
2 files changed, 77 insertions, 45 deletions
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<Vec<Session>>),
+ List(seed::fetch::ResponseDataResult<Vec<crate::model::Session>>),
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<Session>,
- watch_conn: Option<WatchConn>,
-}
-
-impl Model {
- fn list(&self) -> impl futures::Future<Item = Msg, Error = Msg> {
- seed::Request::new(LIST_URL).fetch_json_data(Msg::List)
- }
-
- fn watch(&mut self, id: &str, orders: &mut impl Orders<Msg>) {
- 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<Msg>) -> Init<Model> {
+fn init(_: Url, orders: &mut impl Orders<Msg>) -> Init<crate::model::Model> {
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<Msg>) {
+fn update(
+ msg: Msg,
+ model: &mut crate::model::Model,
+ orders: &mut impl Orders<Msg>,
+) {
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<Msg>) {
}
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<Msg>) {
}
}
-fn view(model: &Model) -> impl View<Msg> {
+fn view(model: &crate::model::Model) -> impl View<Msg> {
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<Session>,
+ watch_conn: Option<WatchConn>,
+}
+
+impl Model {
+ pub(crate) fn list(
+ &self,
+ ) -> impl futures::Future<Item = crate::Msg, Error = crate::Msg> {
+ seed::Request::new(LIST_URL).fetch_json_data(crate::Msg::List)
+ }
+
+ pub(crate) fn watch(
+ &mut self,
+ id: &str,
+ orders: &mut impl Orders<crate::Msg>,
+ ) {
+ 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<Session>) {
+ 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;
+ }
+}