12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- use std::{
- io::{BufRead, BufReader},
- path::PathBuf,
- };
- use dioxus_core::Template;
- #[cfg(feature = "file_watcher")]
- pub use dioxus_html::HtmlCtx;
- use interprocess_docfix::local_socket::LocalSocketStream;
- use serde::{Deserialize, Serialize};
- #[cfg(feature = "custom_file_watcher")]
- mod file_watcher;
- #[cfg(feature = "custom_file_watcher")]
- pub use file_watcher::*;
- /// A message the hot reloading server sends to the client
- #[derive(Debug, Serialize, Deserialize, Clone, Copy)]
- pub enum HotReloadMsg {
- /// A template has been updated
- #[serde(borrow = "'static")]
- UpdateTemplate(Template<'static>),
- /// The program needs to be recompiled, and the client should shut down
- Shutdown,
- }
- /// Connect to the hot reloading listener. The callback provided will be called every time a template change is detected
- pub fn connect(mut f: impl FnMut(HotReloadMsg) + Send + 'static) {
- std::thread::spawn(move || {
- let path = PathBuf::from("./").join("target").join("dioxusin");
- if let Ok(socket) = LocalSocketStream::connect(path) {
- let mut buf_reader = BufReader::new(socket);
- loop {
- let mut buf = String::new();
- match buf_reader.read_line(&mut buf) {
- Ok(_) => {
- let template: HotReloadMsg =
- serde_json::from_str(Box::leak(buf.into_boxed_str())).unwrap();
- f(template);
- }
- Err(err) => {
- if err.kind() != std::io::ErrorKind::WouldBlock {
- break;
- }
- }
- }
- }
- }
- });
- }
- /// Start the hot reloading server with the current directory as the root
- #[macro_export]
- macro_rules! hot_reload_init {
- () => {
- #[cfg(debug_assertions)]
- dioxus_hot_reload::init(dioxus_hot_reload::Config::new().root(env!("CARGO_MANIFEST_DIR")));
- };
- ($cfg: expr) => {
- #[cfg(debug_assertions)]
- dioxus_hot_reload::init($cfg.root(env!("CARGO_MANIFEST_DIR")));
- };
- }
|