diff options
author | Matthias Beyer <matthias.beyer@atos.net> | 2021-07-27 16:36:38 +0200 |
---|---|---|
committer | Matthias Beyer <matthias.beyer@atos.net> | 2021-07-27 16:36:38 +0200 |
commit | 76375ea75f7e782eaa326f63cae079847e1d5efb (patch) | |
tree | 415c9b3cc37d2969920eceb8fcaa4fff6dc0bd28 /src/commands/what_depends.rs | |
parent | 45cda0f70ab0f1d717c3dc2b481ad84a4ff0f00f (diff) | |
parent | caa913fbf189d095e8b1a727d655a3c39409d35e (diff) |
Merge branch 'parallelize-package-print-preparation'
Diffstat (limited to 'src/commands/what_depends.rs')
-rw-r--r-- | src/commands/what_depends.rs | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/src/commands/what_depends.rs b/src/commands/what_depends.rs index 10c9edc..1b28620 100644 --- a/src/commands/what_depends.rs +++ b/src/commands/what_depends.rs @@ -10,8 +10,12 @@ //! Implementation of the 'what_depends' subcommand +use std::io::Write; + use anyhow::Result; use clap::ArgMatches; +use futures::stream::StreamExt; +use futures::stream::TryStreamExt; use log::trace; use resiter::Filter; use resiter::Map; @@ -20,6 +24,7 @@ use crate::commands::util::getbool; use crate::config::*; use crate::package::PackageName; use crate::repository::Repository; +use crate::ui::*; /// Implementation of the "what_depends" subcommand pub async fn what_depends( @@ -54,16 +59,9 @@ pub async fn what_depends( ) }; - let format = config.package_print_format(); - let mut stdout = std::io::stdout(); - - let packages = repo - .packages() - .map(|package| package_filter.filter(package).map(|b| (b, package))) - .filter_ok(|(b, _)| *b) - .map_ok(|tpl| tpl.1) - .inspect(|pkg| trace!("Found package: {:?}", pkg)) - .collect::<Result<Vec<_>>>()?; + let hb = crate::ui::handlebars_for_package_printing(config.package_print_format())?; + let stdout = std::io::stdout(); + let mut outlock = stdout.lock(); let flags = crate::ui::PackagePrintFlags { print_all: false, @@ -82,5 +80,23 @@ pub async fn what_depends( script_highlighting: false, }; - crate::ui::print_packages(&mut stdout, format, packages.into_iter(), config, &flags) + let mut i = 0; + let iter = repo + .packages() + .map(|package| package_filter.filter(package).map(|b| (b, package))) + .filter_ok(|(b, _)| *b) + .map_ok(|tpl| tpl.1) + .inspect(|pkg| trace!("Found package: {:?}", pkg)) + .map_ok(|p| { // poor mans enumerate_ok() + i += 1; + p.prepare_print(config, &flags, &hb, i) + }); + + tokio_stream::iter(iter) + .map(|pp| pp.and_then(|p| p.into_displayable())) + .try_for_each(|p| { + let r = writeln!(&mut outlock, "{}", p).map_err(anyhow::Error::from); + futures::future::ready(r) + }) + .await } |