upnp_rs/common/
interface.rs1use 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}