use crate::{
device::{AllowedIp, PeerConfig},
key::Key,
};
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr};
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct PeerConfigBuilder {
pub(crate) public_key: Key,
pub(crate) preshared_key: Option<Key>,
pub(crate) endpoint: Option<SocketAddr>,
pub(crate) persistent_keepalive_interval: Option<u16>,
pub(crate) allowed_ips: Vec<AllowedIp>,
pub(crate) replace_allowed_ips: bool,
pub(crate) remove_me: bool,
}
impl PeerConfigBuilder {
pub fn new(public_key: &Key) -> Self {
PeerConfigBuilder {
public_key: public_key.clone(),
preshared_key: None,
endpoint: None,
persistent_keepalive_interval: None,
allowed_ips: vec![],
replace_allowed_ips: false,
remove_me: false,
}
}
pub fn into_peer_config(self) -> PeerConfig {
PeerConfig {
public_key: self.public_key,
preshared_key: self.preshared_key,
endpoint: self.endpoint,
persistent_keepalive_interval: self.persistent_keepalive_interval,
allowed_ips: self.allowed_ips,
}
}
pub fn public_key(&self) -> &Key {
&self.public_key
}
pub fn from_peer_config(config: PeerConfig) -> Self {
let mut builder = Self::new(&config.public_key);
if let Some(k) = config.preshared_key {
builder = builder.set_preshared_key(k);
}
if let Some(e) = config.endpoint {
builder = builder.set_endpoint(e);
}
if let Some(k) = config.persistent_keepalive_interval {
builder = builder.set_persistent_keepalive_interval(k);
}
builder
.replace_allowed_ips()
.add_allowed_ips(&config.allowed_ips)
}
#[must_use]
pub fn set_preshared_key(mut self, key: Key) -> Self {
self.preshared_key = Some(key);
self
}
#[must_use]
pub fn unset_preshared_key(self) -> Self {
self.set_preshared_key(Key::zero())
}
#[must_use]
pub fn set_endpoint(mut self, address: SocketAddr) -> Self {
self.endpoint = Some(address);
self
}
#[must_use]
pub fn set_persistent_keepalive_interval(mut self, interval: u16) -> Self {
self.persistent_keepalive_interval = Some(interval);
self
}
#[must_use]
pub fn unset_persistent_keepalive(self) -> Self {
self.set_persistent_keepalive_interval(0)
}
#[must_use]
pub fn add_allowed_ip(mut self, address: IpAddr, cidr: u8) -> Self {
self.allowed_ips.push(AllowedIp { address, cidr });
self
}
#[must_use]
pub fn add_allowed_ips(mut self, ips: &[AllowedIp]) -> Self {
self.allowed_ips.extend_from_slice(ips);
self
}
#[must_use]
pub fn allow_all_ips(self) -> Self {
self.add_allowed_ip(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 0)
.add_allowed_ip(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 0)), 0)
}
#[must_use]
pub fn replace_allowed_ips(mut self) -> Self {
self.replace_allowed_ips = true;
self
}
#[must_use]
pub fn remove(mut self) -> Self {
self.remove_me = true;
self
}
}