aboutsummaryrefslogtreecommitdiff
path: root/xtask/src/run/iter.rs
diff options
context:
space:
mode:
Diffstat (limited to 'xtask/src/run/iter.rs')
-rw-r--r--xtask/src/run/iter.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/xtask/src/run/iter.rs b/xtask/src/run/iter.rs
new file mode 100644
index 0000000..d18ad49
--- /dev/null
+++ b/xtask/src/run/iter.rs
@@ -0,0 +1,48 @@
+use super::FinalRunResult;
+
+pub use iter::*;
+
+pub trait CoalescingRunner<'c> {
+ /// Run all the commands in this iterator, and coalesce the results into
+ /// one error (if any individual commands failed)
+ fn run_and_coalesce(self) -> Vec<FinalRunResult<'c>>;
+}
+
+#[cfg(not(feature = "rayon"))]
+mod iter {
+ use super::*;
+ use crate::{argument_parsing::Globals, cargo_command::*, run::run_and_convert};
+
+ pub fn into_iter<T: IntoIterator>(var: T) -> impl Iterator<Item = T::Item> {
+ var.into_iter()
+ }
+
+ impl<'g, 'c, I> CoalescingRunner<'c> for I
+ where
+ I: Iterator<Item = (&'g Globals, CargoCommand<'c>, bool)>,
+ {
+ fn run_and_coalesce(self) -> Vec<FinalRunResult<'c>> {
+ self.map(run_and_convert).collect()
+ }
+ }
+}
+
+#[cfg(feature = "rayon")]
+mod iter {
+ use super::*;
+ use crate::{argument_parsing::Globals, cargo_command::*, run::run_and_convert};
+ use rayon::prelude::*;
+
+ pub fn into_iter<T: IntoParallelIterator>(var: T) -> impl ParallelIterator<Item = T::Item> {
+ var.into_par_iter()
+ }
+
+ impl<'g, 'c, I> CoalescingRunner<'c> for I
+ where
+ I: ParallelIterator<Item = (&'g Globals, CargoCommand<'c>, bool)>,
+ {
+ fn run_and_coalesce(self) -> Vec<FinalRunResult<'c>> {
+ self.map(run_and_convert).collect()
+ }
+ }
+}