use std::collections::BTreeSet;
use std::time::Instant;
use crate::terminal::format;
use radicle::node::NodeId;
pub struct UploadPack {
remotes: BTreeSet<NodeId>,
timer: Instant,
}
impl Default for UploadPack {
fn default() -> Self {
Self::new()
}
}
impl UploadPack {
#[must_use]
pub fn new() -> Self {
Self {
remotes: BTreeSet::new(),
timer: Instant::now(),
}
}
pub fn transmitted(&mut self, remote: NodeId, transmitted: usize) -> String {
self.remotes.insert(remote);
let throughput = transmitted as f64 / self.timer.elapsed().as_secs_f64();
let throughput = format::bytes(throughput.floor() as usize);
let n = self.remotes.len();
let transmitted = format::bytes(transmitted);
format!("Uploading to {n} peer(s) ({transmitted} | {throughput:.2}/s)")
}
pub fn done(&mut self, remote: &NodeId) -> String {
self.remotes.remove(remote);
let n = self.remotes.len();
format!("Uploaded to {remote}, {n} peer(s) remaining..")
}
}