grass/dev/iterator/
location_and_change_status.rs1use tracing::trace;
2
3use crate::dev::{strategy::git::RepositoryChangeStatus, RepositoryLocation};
4
5pub struct UncommittedChangesOnlyIterator<'a, T> {
6 source: &'a mut T,
7}
8
9impl<'a, T: Iterator<Item = (RepositoryLocation, RepositoryChangeStatus)>> Iterator
10 for UncommittedChangesOnlyIterator<'a, T>
11{
12 type Item = (RepositoryLocation, RepositoryChangeStatus);
13
14 fn next(&mut self) -> Option<Self::Item> {
15 for next in &mut self.source {
16 trace!(
17 "Considering repository '{}';\nWith change status {}",
18 next.0,
19 next.1
20 );
21
22 if matches!(next.1, RepositoryChangeStatus::UpToDate) {
23 continue;
24 };
25
26 return Some(next);
27 }
28 None
29 }
30}
31
32pub trait LocationAndChangeStatusIterExtensions:
33 Iterator<Item = (RepositoryLocation, RepositoryChangeStatus)> + Sized
34{
35 fn uncommitted_changes_only(&mut self) -> UncommittedChangesOnlyIterator<Self>;
36}
37
38impl<T: Iterator<Item = (RepositoryLocation, RepositoryChangeStatus)> + Sized>
39 LocationAndChangeStatusIterExtensions for T
40{
41 fn uncommitted_changes_only(&mut self) -> UncommittedChangesOnlyIterator<Self> {
42 UncommittedChangesOnlyIterator { source: self }
43 }
44}