From 75e13749ea2911f33ff59bc29583dea07ec7aadc Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Thu, 16 Jun 2022 09:11:56 -0500 Subject: [PATCH] set multiple rsx calls at once to prevent duplicated errors --- packages/desktop/src/controller.rs | 6 +++--- packages/rsx_interpreter/src/lib.rs | 15 +++++++++++++++ packages/web/src/lib.rs | 6 +++--- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/packages/desktop/src/controller.rs b/packages/desktop/src/controller.rs index 1dacadbf4..b6a954b01 100644 --- a/packages/desktop/src/controller.rs +++ b/packages/desktop/src/controller.rs @@ -54,7 +54,7 @@ impl DesktopController { #[cfg(feature = "hot_reload")] { use dioxus_rsx_interpreter::{ - error::Error, ErrorHandler, SetRsxMessage, RSX_CONTEXT, + error::Error, ErrorHandler, SetManyRsxMessage, RSX_CONTEXT, }; use interprocess::local_socket::{LocalSocketListener, LocalSocketStream}; use std::io::{BufRead, BufReader, Write}; @@ -120,9 +120,9 @@ impl DesktopController { let mut buf = String::new(); match conn.read_line(&mut buf) { Ok(_) => { - let message: SetRsxMessage = + let msgs: SetManyRsxMessage = serde_json::from_str(&buf).unwrap(); - RSX_CONTEXT.insert(message.location, message.new_text); + RSX_CONTEXT.extend(msgs); } Err(err) => { if err.kind() != std::io::ErrorKind::WouldBlock { diff --git a/packages/rsx_interpreter/src/lib.rs b/packages/rsx_interpreter/src/lib.rs index db6fb4a3a..98898867a 100644 --- a/packages/rsx_interpreter/src/lib.rs +++ b/packages/rsx_interpreter/src/lib.rs @@ -125,6 +125,17 @@ impl RsxContext { } } + /// Set the text for many rsx calls + pub fn extend(&self, msg: SetManyRsxMessage) { + let mut write = self.data.write().unwrap(); + for rsx in msg.0 { + write.hm.insert(rsx.location, rsx.new_text); + } + if let Some(channel) = &mut write.scheduler_channel { + channel.unbounded_send(SchedulerMsg::DirtyAll).unwrap() + } + } + fn read(&self) -> RwLockReadGuard { self.data.read().unwrap() } @@ -157,3 +168,7 @@ pub struct SetRsxMessage { pub location: CodeLocation, pub new_text: String, } + +/// Set many rsx texts at once to avoid duplicate errors +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct SetManyRsxMessage(pub Vec); diff --git a/packages/web/src/lib.rs b/packages/web/src/lib.rs index 2377d9336..cb0e92155 100644 --- a/packages/web/src/lib.rs +++ b/packages/web/src/lib.rs @@ -220,7 +220,7 @@ pub async fn run_with_props(root: Component, root_props: T #[cfg(feature = "hot_reload")] { use dioxus_rsx_interpreter::error::Error; - use dioxus_rsx_interpreter::{ErrorHandler, SetRsxMessage, RSX_CONTEXT}; + use dioxus_rsx_interpreter::{ErrorHandler, SetManyRsxMessage, RSX_CONTEXT}; use futures_channel::mpsc::unbounded; use futures_channel::mpsc::UnboundedSender; use futures_util::StreamExt; @@ -246,8 +246,8 @@ pub async fn run_with_props(root: Component, root_props: T // change the rsx when new data is received let cl = Closure::wrap(Box::new(|e: MessageEvent| { if let Ok(text) = e.data().dyn_into::() { - let msg: SetRsxMessage = serde_json::from_str(&format!("{text}")).unwrap(); - RSX_CONTEXT.insert(msg.location, msg.new_text); + let msgs: SetManyRsxMessage = serde_json::from_str(&format!("{text}")).unwrap(); + RSX_CONTEXT.extend(msgs); } }) as Box);