upnp_rs/common/
interface.rs

1use pnet::datalink;
2use std::net::IpAddr;
3
4#[derive(Clone, Debug)]
5#[allow(dead_code)]
6pub enum IP {
7    V4,
8    V6,
9}
10
11pub fn ip_address_for_interface(
12    network_interface: &Option<String>,
13    network_version: &Option<IP>,
14) -> Option<IpAddr> {
15    match network_interface {
16        None => None,
17        Some(name) => {
18            let addresses = ip_addresses_for_interface(name.clone(), network_version.clone());
19            if addresses.is_empty() {
20                None
21            } else {
22                let address = addresses.first().unwrap();
23                Some(*address)
24            }
25        }
26    }
27}
28
29pub fn ip_addresses_for_interface(interface: String, version: Option<IP>) -> Vec<IpAddr> {
30    let interfaces = datalink::interfaces();
31    match &interfaces.into_iter().find(|ni| ni.name == interface) {
32        None => Vec::new(),
33        Some(ni) => ni
34            .ips
35            .iter()
36            .filter_map(|ip| match version {
37                None => Some(ip.ip()),
38                Some(IP::V4) => {
39                    if ip.is_ipv4() {
40                        Some(ip.ip())
41                    } else {
42                        None
43                    }
44                }
45                Some(IP::V6) => {
46                    if ip.is_ipv6() {
47                        Some(ip.ip())
48                    } else {
49                        None
50                    }
51                }
52            })
53            .collect(),
54    }
55}