grass/dev/iterator/
location_and_change_status.rs

1use 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}