netsock 0.7.0

Cross-platform library for network sockets information
Documentation
use std::collections::HashMap;

use crate::error::*;
use crate::socket::SocketInfo;
use crate::sys::windows::socket_table_extended::SocketTable;

pub struct SocketTableIterator {
    table: Vec<u8>,
    rows_count: usize,
    current_row_index: usize,
    process_names: Option<HashMap<u32, String>>,
    info_getter: fn(&[u8], usize, Option<&HashMap<u32, String>>) -> SocketInfo,
}

impl SocketTableIterator {
    pub fn new<Table: SocketTable>() -> Result<Self, Error> {
        let table = Table::get_table()?;
        Ok(SocketTableIterator {
            rows_count: Table::get_rows_count(&table),
            process_names: Table::get_process_names().ok(),
            info_getter: Table::get_socket_info,
            current_row_index: 0,
            table,
        })
    }
}

impl Iterator for SocketTableIterator {
    type Item = Result<SocketInfo, Error>;
    fn next(&mut self) -> Option<Self::Item> {
        if self.current_row_index == self.rows_count {
            None
        } else {
            let socket_info = (self.info_getter)(
                &self.table,
                self.current_row_index,
                self.process_names.as_ref(),
            );
            self.current_row_index += 1;
            Some(Ok(socket_info))
        }
    }
}