From 601630beee35d3e6c892199f7a99b48d6c464fa7 Mon Sep 17 00:00:00 2001 From: Valentin Haudiquet Date: Thu, 27 Nov 2025 23:43:48 +0100 Subject: [PATCH] main: clean up ui code --- src/main.rs | 28 +++------------------------- src/ui.rs | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 25 deletions(-) create mode 100644 src/ui.rs diff --git a/src/main.rs b/src/main.rs index 7f62105..ddd91c8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,5 @@ use std::env; use std::io::Write; -use std::time::Duration; extern crate clap; use clap::{arg, command, Command}; @@ -16,6 +15,8 @@ use changelog::generate_entry; use log::{info, error}; use indicatif_log_bridge::LogWrapper; +mod ui; + fn main() { let rt = tokio::runtime::Runtime::new().unwrap(); let logger = @@ -67,30 +68,7 @@ fn main() { let ppa = sub_matches.get_one::("ppa").map(|s| s.as_str()).unwrap_or(""); // Since get is async, we need to block on it - let pb = multi.add(indicatif::ProgressBar::new(0)); - pb.enable_steady_tick(Duration::from_millis(50)); - - let mut progress_callback = |prefix: &str, msg: &str, progress: usize, total: usize| { - - if progress != 0 && total != 0 { - pb.set_style(indicatif::ProgressStyle::default_bar() - .template("> {spinner:.blue} {prefix}\n {msg} [{bar:40.cyan/blue}] {pos}/{len} ({eta})") - .unwrap() - .progress_chars("=> ")); - } else { - pb.set_style(indicatif::ProgressStyle::default_bar() - .template("> {spinner:.blue} {prefix}") - .unwrap()); - } - - if ! prefix.is_empty() { - pb.set_prefix(prefix.to_string()); - } - - pb.set_message(msg.to_string()); - pb.set_length(total as u64); - pb.set_position(progress as u64); - }; + let (pb, mut progress_callback) = ui::create_progress_bar(&multi); if let Err(e) = rt.block_on(get(package, version, series, "", ppa, None, Some(&mut progress_callback))) { pb.finish_and_clear(); diff --git a/src/ui.rs b/src/ui.rs new file mode 100644 index 0000000..8988425 --- /dev/null +++ b/src/ui.rs @@ -0,0 +1,35 @@ +use std::time::Duration; +use indicatif::{MultiProgress, ProgressBar, ProgressStyle}; + +pub fn create_progress_bar(multi: &MultiProgress) -> (ProgressBar, impl Fn(&str, &str, usize, usize) + '_) { + let pb = multi.add(ProgressBar::new(0)); + pb.enable_steady_tick(Duration::from_millis(50)); + pb.set_style(ProgressStyle::default_bar() + .template("> {spinner:.blue} {prefix}") + .unwrap()); + + let pb_clone = pb.clone(); + let callback = move |prefix: &str, msg: &str, progress: usize, total: usize| { + let pb = &pb_clone; + if progress != 0 && total != 0 { + pb.set_style(ProgressStyle::default_bar() + .template("> {spinner:.blue} {prefix}\n {msg} [{bar:40.cyan/blue}] {pos}/{len} ({eta})") + .unwrap() + .progress_chars("=> ")); + } else { + pb.set_style(ProgressStyle::default_bar() + .template("> {spinner:.blue} {prefix}") + .unwrap()); + } + + if !prefix.is_empty() { + pb.set_prefix(prefix.to_string()); + } + + pb.set_message(msg.to_string()); + pb.set_length(total as u64); + pb.set_position(progress as u64); + }; + + (pb, callback) +}