use std::net::IpAddr;
extern crate get_if_addrs;
use get_if_addrs::get_if_addrs;
#[derive(Clone, Debug, PartialEq)]
pub enum AddressCommand {
Discover,
}
#[derive(Clone, Debug, PartialEq)]
pub enum AddressUpdate {
None,
Discovered(Vec<IpAddr>),
Removed(IpAddr),
}
pub struct AddressPlugin {
known: Vec<IpAddr>,
}
impl AddressPlugin {
pub fn new() -> Self {
Self { known: vec![] }
}
pub async fn update(&mut self) -> Result<(), std::io::Error> {
let res = self.get_addrs().await?;
let mut added = vec![];
for i in &res {
if !self.known.contains(i) {
added.push(i.clone());
self.known.push(i.clone());
}
}
let mut removed = vec![];
for i in 0..self.known.len() {
let a = &self.known[i];
if !res.contains(a) {
removed.push(a.clone());
self.known.remove(i);
}
}
info!("Discovered: {:?} Removed: {:?}", added, removed);
Ok(())
}
pub async fn get_addrs(&mut self) -> Result<Vec<IpAddr>, std::io::Error> {
let a = get_if_addrs()?;
let a = a
.iter()
.map(|v| v.ip().clone())
.filter(|v| !v.is_loopback())
.collect();
Ok(a)
}
}