wireguard_conf/models/
interface.rs1use 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}