update for notify 5.0.0-pre.16

This commit is contained in:
trevyn committed 2022-08-15 07:47:19 -04:00
1 parent a853c1fb18
commit 6d9ec38eac
2 files changed
+109 -102

No files matched your search

+1 -1
View File
@@ -25,7 +25,7 @@ toml = "0.5.8"
fs_extra = "1.2.0" fs_extra = "1.2.0"
cargo_toml = "0.11.4" cargo_toml = "0.11.4"
futures = "0.3.21" futures = "0.3.21"
notify = { version = "5.0.0-pre.13", features = ["serde"] } notify = { version = "5.0.0-pre.16", features = ["serde"] }
html_parser = "0.6.2" html_parser = "0.6.2"
binary-install = "0.0.2" binary-install = "0.0.2"
convert_case = "0.5.0" convert_case = "0.5.0"
+108 -101
View File
@@ -98,100 +98,104 @@ pub async fn startup_hot_reload(port: u16, config: CrateConfig) -> Result<()> {
.unwrap_or_else(|| vec![PathBuf::from("src")]); .unwrap_or_else(|| vec![PathBuf::from("src")]);
let watcher_config = config.clone(); let watcher_config = config.clone();
let mut watcher = RecommendedWatcher::new(move |evt: notify::Result<notify::Event>| { let mut watcher = RecommendedWatcher::new(
let config = watcher_config.clone(); move |evt: notify::Result<notify::Event>| {
if chrono::Local::now().timestamp() > last_update_time { let config = watcher_config.clone();
// Give time for the change to take effect before reading the file if chrono::Local::now().timestamp() > last_update_time {
std::thread::sleep(std::time::Duration::from_millis(100)); // Give time for the change to take effect before reading the file
if let Ok(evt) = evt { std::thread::sleep(std::time::Duration::from_millis(100));
let mut messages = Vec::new(); if let Ok(evt) = evt {
let mut needs_rebuild = false; let mut messages = Vec::new();
for path in evt.paths.clone() { let mut needs_rebuild = false;
let mut file = File::open(path.clone()).unwrap(); for path in evt.paths.clone() {
if path.extension().map(|p| p.to_str()).flatten() != Some("rs") { let mut file = File::open(path.clone()).unwrap();
continue; if path.extension().map(|p| p.to_str()).flatten() != Some("rs") {
} continue;
let mut src = String::new(); }
file.read_to_string(&mut src).expect("Unable to read file"); let mut src = String::new();
// find changes to the rsx in the file file.read_to_string(&mut src).expect("Unable to read file");
if let Ok(syntax) = syn::parse_file(&src) { // find changes to the rsx in the file
let mut last_file_rebuild = last_file_rebuild.lock().unwrap(); if let Ok(syntax) = syn::parse_file(&src) {
if let Some(old_str) = last_file_rebuild.map.get(&path) { let mut last_file_rebuild = last_file_rebuild.lock().unwrap();
if let Ok(old) = syn::parse_file(&old_str) { if let Some(old_str) = last_file_rebuild.map.get(&path) {
match find_rsx(&syntax, &old) { if let Ok(old) = syn::parse_file(&old_str) {
DiffResult::CodeChanged => { match find_rsx(&syntax, &old) {
needs_rebuild = true; DiffResult::CodeChanged => {
last_file_rebuild.map.insert(path, src); needs_rebuild = true;
} last_file_rebuild.map.insert(path, src);
DiffResult::RsxChanged(changed) => { }
log::info!("🪁 reloading rsx"); DiffResult::RsxChanged(changed) => {
for (old, new) in changed.into_iter() { log::info!("🪁 reloading rsx");
let hr = get_location( for (old, new) in changed.into_iter() {
&crate_dir, let hr = get_location(
&path.to_path_buf(), &crate_dir,
old.to_token_stream(), &path.to_path_buf(),
); old.to_token_stream(),
// get the original source code to preserve whitespace );
let span = new.span(); // get the original source code to preserve whitespace
let start = span.start(); let span = new.span();
let end = span.end(); let start = span.start();
let mut lines: Vec<_> = src let end = span.end();
.lines() let mut lines: Vec<_> = src
.skip(start.line - 1) .lines()
.take(end.line - start.line + 1) .skip(start.line - 1)
.collect(); .take(end.line - start.line + 1)
if let Some(first) = lines.first_mut() { .collect();
*first = first.split_at(start.column).1; if let Some(first) = lines.first_mut() {
} *first = first.split_at(start.column).1;
if let Some(last) = lines.last_mut() {
// if there is only one line the start index of last line will be the start of the rsx!, not the start of the line
if start.line == end.line {
*last =
last.split_at(end.column - start.column).0;
} else {
*last = last.split_at(end.column).0;
} }
if let Some(last) = lines.last_mut() {
// if there is only one line the start index of last line will be the start of the rsx!, not the start of the line
if start.line == end.line {
*last = last
.split_at(end.column - start.column)
.0;
} else {
*last = last.split_at(end.column).0;
}
}
let rsx = lines.join("\n");
messages.push(SetRsxMessage {
location: hr,
new_text: rsx,
});
} }
let rsx = lines.join("\n");
messages.push(SetRsxMessage {
location: hr,
new_text: rsx,
});
} }
} }
} }
} else {
// if this is a new file, rebuild the project
*last_file_rebuild = FileMap::new(crate_dir.clone());
} }
} else {
// if this is a new file, rebuild the project
*last_file_rebuild = FileMap::new(crate_dir.clone());
} }
} }
} if needs_rebuild {
if needs_rebuild { match build_manager.rebuild() {
match build_manager.rebuild() { Ok(res) => {
Ok(res) => { print_console_info(
print_console_info( port,
port, &config,
&config, PrettierOptions {
PrettierOptions { changed: evt.paths,
changed: evt.paths, warnings: res.warnings,
warnings: res.warnings, elapsed_time: res.elapsed_time,
elapsed_time: res.elapsed_time, },
}, );
); }
} Err(err) => {
Err(err) => { log::error!("{}", err);
log::error!("{}", err); }
} }
} }
if !messages.is_empty() {
let _ = hot_reload_tx.send(SetManyRsxMessage(messages));
}
} }
if !messages.is_empty() { last_update_time = chrono::Local::now().timestamp();
let _ = hot_reload_tx.send(SetManyRsxMessage(messages));
}
} }
last_update_time = chrono::Local::now().timestamp(); },
} notify::Config::default(),
}) )
.unwrap(); .unwrap();
for sub_path in allow_watch_path { for sub_path in allow_watch_path {
@@ -304,28 +308,31 @@ pub async fn startup_default(port: u16, config: CrateConfig) -> Result<()> {
.unwrap_or_else(|| vec![PathBuf::from("src")]); .unwrap_or_else(|| vec![PathBuf::from("src")]);
let watcher_config = config.clone(); let watcher_config = config.clone();
let mut watcher = RecommendedWatcher::new(move |info: notify::Result<notify::Event>| { let mut watcher = RecommendedWatcher::new(
let config = watcher_config.clone(); move |info: notify::Result<notify::Event>| {
if info.is_ok() { let config = watcher_config.clone();
if chrono::Local::now().timestamp() > last_update_time { if info.is_ok() {
match build_manager.rebuild() { if chrono::Local::now().timestamp() > last_update_time {
Ok(res) => { match build_manager.rebuild() {
last_update_time = chrono::Local::now().timestamp(); Ok(res) => {
print_console_info( last_update_time = chrono::Local::now().timestamp();
port, print_console_info(
&config, port,
PrettierOptions { &config,
changed: info.unwrap().paths, PrettierOptions {
warnings: res.warnings, changed: info.unwrap().paths,
elapsed_time: res.elapsed_time, warnings: res.warnings,
}, elapsed_time: res.elapsed_time,
); },
);
}
Err(e) => log::error!("{}", e),
} }
Err(e) => log::error!("{}", e),
} }
} }
} },
}) notify::Config::default(),
)
.unwrap(); .unwrap();
for sub_path in allow_watch_path { for sub_path in allow_watch_path {