wireguard_conf/models/
interface.rs

1use either::Either;
2use ipnet::Ipv4Net;
3
4use std::fmt;
5
6use crate::prelude::*;
7
8#[must_use]
9#[derive(Clone, Debug)]
10pub struct Interface {
11    pub address: Ipv4Net,
12    pub listen_port: Option<u16>,
13    pub private_key: PrivateKey,
14    pub dns: Vec<String>,
15    pub endpoint: Option<String>,
16
17    #[cfg(feature = "amneziawg")]
18    #[cfg_attr(docsrs, doc(cfg(feature = "amneziawg")))]
19    pub amnezia_settings: Option<AmneziaSettings>,
20
21    pub peers: Vec<Peer>,
22}
23
24impl Interface {
25    pub fn to_peer(&self) -> Peer {
26        Peer {
27            endpoint: self.endpoint.clone(),
28            allowed_ips: vec![self.address],
29            key: Either::Left(self.private_key.clone()),
30
31            #[cfg(feature = "amneziawg")]
32            amnezia_settings: self.amnezia_settings.clone(),
33        }
34    }
35}
36
37impl fmt::Display for Interface {
38    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
39        writeln!(f, "[Interface]")?;
40        if let Some(endpoint) = &self.endpoint {
41            writeln!(f, "# Name = {endpoint}")?;
42        }
43        writeln!(f, "Address = {}", self.address)?;
44        if let Some(listen_port) = self.listen_port {
45            writeln!(f, "ListenPort = {listen_port}")?;
46        }
47        writeln!(f, "PrivateKey = {}", self.private_key)?;
48        if !self.dns.is_empty() {
49            writeln!(f, "DNS = {}", self.dns.join(","))?;
50        }
51
52        #[cfg(feature = "amneziawg")]
53        if let Some(amnezia_settings) = &self.amnezia_settings {
54            writeln!(f)?;
55            writeln!(f, "{amnezia_settings}")?;
56        }
57
58        for peer in &self.peers {
59            writeln!(f)?;
60            writeln!(f, "{peer}")?;
61        }
62
63        fmt::Result::Ok(())
64    }
65}