use crate::error::Error;
use crate::platform;
use crate::platform::ffi;
use std::fmt;
use std::path::Path;
use std::path::PathBuf;
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub enum Direction {
#[default]
Into,
OutOf,
}
pub struct UnixSocketConfiguration {
pub(crate) handle: ffi::CzUnixSocketConfiguration,
}
unsafe impl Send for UnixSocketConfiguration {}
unsafe impl Sync for UnixSocketConfiguration {}
impl UnixSocketConfiguration {
pub fn new(source: impl AsRef<Path>, destination: impl AsRef<Path>) -> Result<Self, Error> {
let source = platform::path(source.as_ref())?;
let destination = platform::path(destination.as_ref())?;
let outcome = platform::outcome(
ffi::cz_unix_socket_configuration_new(source, destination),
format!("configure a socket relay from {source} to {destination}"),
)?;
Ok(Self {
handle: outcome.unix_socket_configuration(),
})
}
pub fn id(&self) -> String {
self.handle.id()
}
pub fn source(&self) -> PathBuf {
PathBuf::from(self.handle.source())
}
pub fn set_source(&mut self, source: impl AsRef<Path>) -> Result<(), Error> {
self.handle.set_source(platform::path(source.as_ref())?);
Ok(())
}
pub fn destination(&self) -> PathBuf {
PathBuf::from(self.handle.destination())
}
pub fn set_destination(&mut self, destination: impl AsRef<Path>) -> Result<(), Error> {
self
.handle
.set_destination(platform::path(destination.as_ref())?);
Ok(())
}
pub fn permissions(&self) -> Option<u16> {
self.handle.permissions()
}
pub fn set_permissions(&mut self, permissions: Option<u16>) {
self.handle.set_permissions(permissions);
}
pub fn direction(&self) -> Direction {
self.handle.direction().into()
}
pub fn set_direction(&mut self, direction: Direction) {
self.handle.set_direction(direction.into());
}
}
impl Clone for UnixSocketConfiguration {
fn clone(&self) -> Self {
Self {
handle: self.handle.duplicate(),
}
}
}
impl fmt::Debug for UnixSocketConfiguration {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter
.debug_struct("UnixSocketConfiguration")
.field("id", &self.id())
.field("source", &self.source())
.field("destination", &self.destination())
.field("permissions", &self.permissions())
.field("direction", &self.direction())
.finish()
}
}
impl PartialEq for UnixSocketConfiguration {
fn eq(&self, other: &Self) -> bool {
self.id() == other.id()
&& self.source() == other.source()
&& self.destination() == other.destination()
&& self.permissions() == other.permissions()
&& self.direction() == other.direction()
}
}
impl Eq for UnixSocketConfiguration {}