radicle: use a struct to help announce success counts

It is easy to mix up the order of a tuple, so a struct is introduced instead to
ensure that the correct counts are used.
This commit is contained in:
Fintan Halpenny 2025-05-30 09:41:49 +02:00
parent 5a0c14cf61
commit aa7dcd92db
1 changed files with 29 additions and 7 deletions

View File

@ -153,7 +153,7 @@ impl Announcer {
/// Get the [`Progress`] of the [`Announcer`]. /// Get the [`Progress`] of the [`Announcer`].
pub fn progress(&self) -> Progress { pub fn progress(&self) -> Progress {
let (synced, preferred) = self.success_counts(); let SuccessCounts { preferred, synced } = self.success_counts();
let unsynced = self.to_sync.len().saturating_sub(synced); let unsynced = self.to_sync.len().saturating_sub(synced);
Progress { Progress {
preferred, preferred,
@ -174,7 +174,7 @@ impl Announcer {
} }
fn is_target_reached(&self) -> Option<SuccessfulOutcome> { fn is_target_reached(&self) -> Option<SuccessfulOutcome> {
let (preferred, synced) = self.success_counts(); let SuccessCounts { preferred, synced } = self.success_counts();
let reached_preferred = self.target.preferred_seeds.is_empty() let reached_preferred = self.target.preferred_seeds.is_empty()
|| preferred >= self.target.preferred_seeds.len(); || preferred >= self.target.preferred_seeds.len();
@ -188,19 +188,41 @@ impl Announcer {
} }
} }
fn success_counts(&self) -> (usize, usize) { fn success_counts(&self) -> SuccessCounts {
self.synced self.synced
.keys() .keys()
.fold((0, 0), |(mut preferred, mut succeeded), nid| { .fold(SuccessCounts::default(), |counts, nid| {
succeeded += 1;
if self.target.preferred_seeds.contains(nid) { if self.target.preferred_seeds.contains(nid) {
preferred += 1; counts.preferred().synced()
} else {
counts.synced()
} }
(preferred, succeeded)
}) })
} }
} }
#[derive(Default)]
struct SuccessCounts {
preferred: usize,
synced: usize,
}
impl SuccessCounts {
fn synced(self) -> Self {
Self {
synced: self.synced + 1,
..self
}
}
fn preferred(self) -> Self {
Self {
preferred: self.preferred + 1,
..self
}
}
}
/// Configuration of the [`Announcer`]. /// Configuration of the [`Announcer`].
pub struct AnnouncerConfig { pub struct AnnouncerConfig {
local_node: NodeId, local_node: NodeId,