From 30f11ccb6606d4f8ffd4a093aa29b20bac42c80d Mon Sep 17 00:00:00 2001 From: Valerio Ageno Date: Mon, 10 Feb 2025 19:50:18 +0100 Subject: [PATCH] feat: add spinner to 'tuono dev' --- crates/tuono/Cargo.toml | 2 ++ crates/tuono/src/watch.rs | 36 ++++++++++++++++++++++++++++++------ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/crates/tuono/Cargo.toml b/crates/tuono/Cargo.toml index 3d1a649d..da54812c 100644 --- a/crates/tuono/Cargo.toml +++ b/crates/tuono/Cargo.toml @@ -31,6 +31,8 @@ serde_json = "1.0" fs_extra = "1.3.0" http = "1.1.0" tuono_internal = {path = "../tuono_internal", version = "0.17.7"} +spinners = "4.1.1" +console = "0.15.10" [dev-dependencies] tempfile = "3.14.0" diff --git a/crates/tuono/src/watch.rs b/crates/tuono/src/watch.rs index e2fbf489..59e45db7 100644 --- a/crates/tuono/src/watch.rs +++ b/crates/tuono/src/watch.rs @@ -9,6 +9,8 @@ use watchexec_supervisor::job::{start_job, Job}; use crate::mode::Mode; use crate::source_builder::bundle_axum_source; +use console::Term; +use spinners::{Spinner, Spinners}; #[cfg(target_os = "windows")] const DEV_WATCH_BIN_SRC: &str = "node_modules\\.bin\\tuono-dev-watch.cmd"; @@ -35,7 +37,7 @@ fn watch_react_src() -> Job { .0 } -fn build_rust_src() -> Job { +fn run_rust_dev_server() -> Job { start_job(Arc::new(Command { program: Program::Exec { prog: "cargo".into(), @@ -46,6 +48,17 @@ fn build_rust_src() -> Job { .0 } +fn build_rust_src() -> Job { + start_job(Arc::new(Command { + program: Program::Exec { + prog: "cargo".into(), + args: vec!["build".to_string(), "-q".to_string()], + }, + options: Default::default(), + })) + .0 +} + fn build_react_ssr_src() -> Job { if !Path::new(DEV_SSR_BIN_SRC).exists() { eprintln!("Failed to find script to run dev ssr. Please run `npm install`"); @@ -63,17 +76,28 @@ fn build_react_ssr_src() -> Job { #[tokio::main] pub async fn watch() -> Result<()> { + let term = Term::stdout(); + let mut sp = Spinner::new(Spinners::Dots, "Starting dev server...".into()); + watch_react_src().start().await; - let run_server = build_rust_src(); + let rust_server = run_rust_dev_server(); + let build_rust_src = build_rust_src(); let build_ssr_bundle = build_react_ssr_src(); build_ssr_bundle.start().await; + build_rust_src.start().await; - run_server.start().await; - + // Wait vite and rust builds build_ssr_bundle.to_wait().await; + build_rust_src.to_wait().await; + + rust_server.start().await; + + // Remove the spinner + sp.stop(); + term.clear_line().unwrap(); let wx = Watchexec::new(move |mut action| { let mut should_reload_ssr_bundle = false; @@ -95,9 +119,9 @@ pub async fn watch() -> Result<()> { if should_reload_rust_server { println!(" Reloading..."); - run_server.stop(); + rust_server.stop(); bundle_axum_source(Mode::Dev).expect("Failed to bundle rust source"); - run_server.start(); + rust_server.start(); } if should_reload_ssr_bundle {