Skip to main content

Library/Fn/Binary/Command/
Parallel.rs

1/// Asynchronously processes entries to generate summaries and outputs the
2/// results.
3///
4/// This function performs the following steps:
5/// 1. Filters and processes the provided entries based on the given pattern and
6///    separator.
7/// 2. Spawns asynchronous tasks to generate summaries for each entry.
8/// 3. Collects the results and outputs them.
9///
10/// # Arguments
11///
12/// * `Option` - A struct containing the following fields:
13///   - `Entry`: A vector of vectors, where each inner vector contains the
14///     components of a file path.
15///   - `Separator`: A character used to join the components of the file path.
16///   - `Pattern`: A string pattern to match against the last element of each
17///     entry.
18///   - `Omit`: A vector of strings representing patterns to omit.
19///
20/// # Example
21///
22/// ```rust
23/// let options = Option {
24/// 	Entry:vec![vec!["path".to_string(), "to".to_string(), "file.git".to_string()]],
25/// 	Separator:'/',
26/// 	Pattern:".git".to_string(),
27/// 	Omit:vec!["target".to_string()],
28/// };
29/// Fn(options).await;
30/// ```
31///
32/// # Errors
33///
34/// This function will log errors if it fails to generate summaries or send
35/// results.
36pub async fn Fn(Option { Entry, Separator, Pattern, Omit, .. }:Option) {
37	let (Allow, mut Mark) = tokio::sync::mpsc::unbounded_channel();
38
39	let Queue = futures::stream::FuturesUnordered::new();
40
41	for Entry in Entry
42		.into_par_iter()
43		.filter_map(|Entry| {
44			Entry
45				.last()
46				.filter(|Last| *Last == &Pattern)
47				.map(|_| Entry[0..Entry.len() - 1].join(&Separator.to_string()))
48		})
49		.collect::<Vec<String>>()
50	{
51		let Omit = Omit.clone();
52
53		let Allow = Allow.clone();
54
55		Queue.push(tokio::spawn(async move {
56			match crate::Fn::Summary::Fn(&Entry, &crate::Struct::Summary::Difference::Struct { Omit }).await {
57				Ok(Summary) => {
58					if let Err(_Error) = Allow.send((Entry, Summary)) {
59						eprintln!("Cannot Allow: {}", _Error);
60					}
61				},
62
63				Err(_Error) => {
64					eprintln!("Cannot Summary for {}: {}", Entry, _Error)
65				},
66			}
67		}));
68	}
69
70	tokio::spawn(async move {
71		Queue.collect::<Vec<_>>().await;
72
73		drop(Allow);
74	});
75
76	let mut Output = Vec::new();
77
78	while let Some((Entry, Summary)) = Mark.recv().await {
79		Output.push((Entry, Summary));
80	}
81
82	crate::Fn::Summary::Group::Fn(Output);
83}
84
85use futures::stream::StreamExt;
86use rayon::iter::{IntoParallelIterator, ParallelIterator};
87
88use crate::Struct::Binary::Command::Entry::Struct as Option;