mod monitor;
mod stream;
pub use monitor::PollingMonitor;
pub use stream::PollingStream;
use super::change::{IpChange, IpChangeKind};
use std::collections::HashMap;
use std::net::IpAddr;
#[must_use]
pub fn merge_changes(changes: &[IpChange], timestamp: std::time::SystemTime) -> Vec<IpChange> {
let mut net_changes: HashMap<(&str, IpAddr), i32> = HashMap::new();
for change in changes {
let key = (change.adapter.as_str(), change.address);
let delta = match change.kind {
IpChangeKind::Added => 1,
IpChangeKind::Removed => -1,
};
*net_changes.entry(key).or_insert(0) += delta;
}
let mut result = Vec::new();
for ((adapter, address), net) in net_changes {
match net.cmp(&0) {
std::cmp::Ordering::Greater => {
result.push(IpChange::added(adapter, address, timestamp));
}
std::cmp::Ordering::Less => {
result.push(IpChange::removed(adapter, address, timestamp));
}
std::cmp::Ordering::Equal => {
}
}
}
result
}
#[cfg(test)]
mod mod_tests;
#[cfg(test)]
mod monitor_tests;
#[cfg(test)]
mod stream_tests;