summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-02-28 19:34:47 +0800
committer魏曹先生 <1992414357@qq.com>2026-02-28 19:34:47 +0800
commit6c9e93b777238372ceb64dcbc168098f9f35385d (patch)
tree12d4203f95dc7ecd7832028be45d2e3488eabce8 /src
parent8d791cfd7592d4839fdcb136444b857553f5d4ca (diff)
Add progress bar support
Diffstat (limited to 'src')
-rw-r--r--src/bin/jvn.rs48
-rw-r--r--src/systems/cmd/processer.rs15
2 files changed, 57 insertions, 6 deletions
diff --git a/src/bin/jvn.rs b/src/bin/jvn.rs
index d20cc18..f2c5cf6 100644
--- a/src/bin/jvn.rs
+++ b/src/bin/jvn.rs
@@ -13,6 +13,10 @@ use just_enough_vcs_cli::{
debug::verbose_logger::init_verbose_logger,
},
};
+use just_progress::{
+ progress,
+ renderer::{ProgressSimpleRenderer, RendererTheme},
+};
use log::{LevelFilter, error, info, trace, warn};
use rust_i18n::{set_locale, t};
@@ -30,6 +34,7 @@ async fn main() {
// Output control flags
let quiet = special_flag!(args, "--quiet") || special_flag!(args, "-q");
let verbose = special_flag!(args, "--verbose") || special_flag!(args, "-V");
+ let no_progress = special_flag!(args, "--no-progress");
let verbose_full = special_flag!(args, "--verbose-full");
// If `--verbose` or `--verbose-full` is enabled and `--quiet` is not enabled, turn on the logger
@@ -46,6 +51,25 @@ async fn main() {
init_verbose_logger(filter);
trace!("{}", t!("verbose.setup_verbose"));
+ // If `--no-progress` or `--quiet` is enabled, the progress bar will not be initialized
+ let progress_future = if no_progress || quiet {
+ None
+ } else {
+ trace!("{}", t!("verbose.setup_progress"));
+
+ // Build progress future
+ let progress_center = progress::init();
+ let renderer = ProgressSimpleRenderer::new()
+ .with_subprogress(true)
+ .with_theme(RendererTheme {
+ layout: "{name},{progress},{percent},{state}",
+ ..Default::default()
+ });
+ Some(progress::bind(progress_center, move |name, state| {
+ renderer.update(name, state)
+ }))
+ };
+
// I18n flags
let lang = special_argument!(args, "--lang").unwrap_or(current_locales());
set_locale(&lang);
@@ -82,18 +106,30 @@ async fn main() {
info!("{}", t!("verbose.user_input", command = args.join(" ")));
- // Process commands
- let render_result = match jv_cmd_process(
- &args.clone(),
+ // Build process future
+ let args_clone = args.clone();
+ let process_future = jv_cmd_process(
+ &args_clone,
JVCommandContext {
help,
confirmed,
args: args.clone(),
},
renderer_override,
- )
- .await
- {
+ );
+
+ // Process commands
+ let (_, process_result) = tokio::join!(
+ async {
+ if let Some(progress_future) = progress_future {
+ progress_future.await;
+ }
+ },
+ process_future
+ );
+
+ // Match result
+ let render_result = match process_result {
Ok(result) => {
info!("{}", t!("verbose.process_success"));
result
diff --git a/src/systems/cmd/processer.rs b/src/systems/cmd/processer.rs
index b4b503e..aa494bb 100644
--- a/src/systems/cmd/processer.rs
+++ b/src/systems/cmd/processer.rs
@@ -1,3 +1,4 @@
+use just_progress::progress;
use log::{error, info, warn};
use rust_i18n::t;
@@ -11,6 +12,20 @@ pub async fn jv_cmd_process(
ctx: JVCommandContext,
renderer_override: String,
) -> Result<JVRenderResult, CmdProcessError> {
+ let result = process(args, ctx, renderer_override).await;
+
+ // Regardless of the result, the progress bar output should be terminated after the command finishes running.
+ // Otherwise, the program will block on the progress bar output.
+ progress::clear_all();
+ progress::close();
+ result
+}
+
+async fn process(
+ args: &Vec<String>,
+ ctx: JVCommandContext,
+ renderer_override: String,
+) -> Result<JVRenderResult, CmdProcessError> {
info!("{}", t!("verbose.cmd_process_start"));
let nodes = jv_cmd_nodes();