ip_nlroute/addr/
get_response.rs1use super::AddressFlags;
2use crate::error::Error;
3use std::collections::BTreeMap;
4use std::net::Ipv4Addr;
5
6#[derive(Debug)]
7pub struct AddrGetResponse {
8 pub interfaces: BTreeMap<u32, AddrGetInterface>,
9}
10
11impl AddrGetResponse {
12 pub fn get_only(&self) -> Result<&AddrGetInterface, Error> {
13 if let Some((_, iface)) = self.interfaces.first_key_value()
14 && self.interfaces.len() == 1
15 {
16 Ok(iface)
17 } else {
18 Err(Error::ExpectedExactlyOne {
19 what: "interface",
20 len: self.interfaces.len(),
21 })
22 }
23 }
24
25 pub fn interfaces_iter(&self) -> impl Iterator<Item = &AddrGetInterface> {
26 self.interfaces.values()
27 }
28}
29
30#[derive(Debug)]
31pub struct AddrGetInterface {
32 pub if_name: Option<String>,
33 pub(crate) addresses: Vec<AddrGetInterfaceAddressV4>,
34}
35
36impl AddrGetInterface {
37 pub fn addresses_v4(&self) -> &[AddrGetInterfaceAddressV4] {
38 self.addresses.as_slice()
39 }
40}
41
42#[derive(Debug, Default)]
43pub struct AddrGetInterfaceAddressV4 {
44 pub(crate) local: Option<Ipv4Addr>,
46 pub(crate) address: Option<Ipv4Addr>,
47
48 pub prefix_len: u8,
49 pub flags: AddressFlags,
50 pub broadcast: Option<Ipv4Addr>,
51 pub label: Option<String>,
52}
53
54impl AddrGetInterfaceAddressV4 {
55 pub fn ip(&self) -> Option<Ipv4Addr> {
56 if let Some(ip) = self.local {
57 Some(ip)
58 } else {
59 self.address
60 }
61 }
62
63 pub fn peer_ip(&self) -> Option<Ipv4Addr> {
64 if let (Some(local), Some(address)) = (self.local, self.address)
65 && local != address
66 {
67 Some(address)
68 } else {
69 None
70 }
71 }
72}