use crate::vpn::connector::Connector;
use crate::vpn::profile::WgProfile;
use crate::vpn::{Backend, ConnectionInfo, LocalMesh, NetError};
#[derive(Default)]
pub struct HostConnector;
pub fn info_for(mesh: &LocalMesh) -> ConnectionInfo {
ConnectionInfo {
backend: Backend::Host,
address: mesh.ip.clone(),
link: mesh.interface.clone(),
peers: vec![],
host_routable: true,
proxy: None,
relay: None,
}
}
pub fn record(mesh: &LocalMesh) -> ConnectionInfo {
let info = info_for(mesh);
crate::vpn::state::save_or_warn(&info);
info
}
impl Connector for HostConnector {
fn available(&self) -> bool {
crate::vpn::local_mesh().is_some()
}
fn connect(&self, _profile: &WgProfile) -> Result<ConnectionInfo, NetError> {
crate::vpn::local_mesh()
.map(|m| record(&m))
.ok_or_else(|| NetError::Backend("no local interface has a mesh address".into()))
}
fn status(&self) -> Result<Option<ConnectionInfo>, NetError> {
let recorded = crate::vpn::state::load().is_some_and(|s| s.backend == Backend::Host);
Ok(recorded
.then(crate::vpn::local_mesh)
.flatten()
.map(|m| info_for(&m)))
}
fn disconnect(&self) -> Result<(), NetError> {
let _ = crate::vpn::state::clear();
Ok(())
}
}