use crate::HelperServiceClient;
#[derive(Debug, thiserror::Error)]
pub enum ClientError {
#[error("helper not reachable: {0}")]
Connection(#[from] std::io::Error),
#[error("helper rpc failed: {0}")]
Rpc(#[from] tarpc::client::RpcError),
#[error("helper error: {0}")]
Helper(String),
}
pub struct Client {
inner: HelperServiceClient,
}
impl Client {
pub async fn connect() -> Result<Self, ClientError> {
let inner = crate::connect().await?;
Ok(Self { inner })
}
pub async fn connect_to(path: &str) -> Result<Self, ClientError> {
let transport = tarpc::serde_transport::unix::connect(
path,
tarpc::tokio_serde::formats::Bincode::default,
)
.await?;
let inner =
crate::HelperServiceClient::new(tarpc::client::Config::default(), transport).spawn();
Ok(Self { inner })
}
pub async fn route_add(&self, subnet: &str, iface: &str) -> Result<(), ClientError> {
self.inner
.route_add(tarpc::context::current(), subnet.into(), iface.into())
.await?
.map_err(ClientError::Helper)
}
pub async fn route_remove(&self, subnet: &str) -> Result<(), ClientError> {
self.inner
.route_remove(tarpc::context::current(), subnet.into())
.await?
.map_err(ClientError::Helper)
}
pub async fn dns_install(&self, domain: &str, port: u16) -> Result<(), ClientError> {
self.inner
.dns_install(tarpc::context::current(), domain.into(), port)
.await?
.map_err(ClientError::Helper)
}
pub async fn dns_uninstall(&self, domain: &str) -> Result<(), ClientError> {
self.inner
.dns_uninstall(tarpc::context::current(), domain.into())
.await?
.map_err(ClientError::Helper)
}
pub async fn dns_status(&self, domain: &str) -> Result<bool, ClientError> {
self.inner
.dns_status(tarpc::context::current(), domain.into())
.await?
.map_err(ClientError::Helper)
}
pub async fn hosts_alias_install(&self) -> Result<(), ClientError> {
self.inner
.hosts_alias_install(tarpc::context::current())
.await?
.map_err(ClientError::Helper)
}
pub async fn hosts_alias_uninstall(&self) -> Result<(), ClientError> {
self.inner
.hosts_alias_uninstall(tarpc::context::current())
.await?
.map_err(ClientError::Helper)
}
pub async fn hosts_alias_status(&self) -> Result<bool, ClientError> {
self.inner
.hosts_alias_status(tarpc::context::current())
.await?
.map_err(ClientError::Helper)
}
pub async fn socket_link(&self, target: &str) -> Result<(), ClientError> {
self.inner
.socket_link(tarpc::context::current(), target.into())
.await?
.map_err(ClientError::Helper)
}
pub async fn socket_unlink(&self) -> Result<(), ClientError> {
self.inner
.socket_unlink(tarpc::context::current())
.await?
.map_err(ClientError::Helper)
}
pub async fn cli_link(&self, name: &str, target: &str) -> Result<(), ClientError> {
self.inner
.cli_link(tarpc::context::current(), name.into(), target.into())
.await?
.map_err(ClientError::Helper)
}
pub async fn cli_unlink(&self, name: &str) -> Result<(), ClientError> {
self.inner
.cli_unlink(tarpc::context::current(), name.into())
.await?
.map_err(ClientError::Helper)
}
pub async fn version(&self) -> Result<String, ClientError> {
Ok(self.inner.version(tarpc::context::current()).await?)
}
}