use std::{io, net};
use interprocess::local_socket::{self, GenericNamespaced, ToNsName};
use thiserror::Error;
use crate::{
ConnectionType,
common::{HandshakeError, Stream},
cpal_thread::PlaybackError,
};
pub type ServerHandle = Box<dyn Stream>;
pub mod audio_client;
pub mod session_client;
pub mod method_client;
#[derive(Debug, Error)]
pub enum ConnectError {
#[error("Io: {0}")]
Io(#[from] io::Error),
#[error("Handshake error: {0}")]
HandshakeError(#[from] HandshakeError),
#[error("Playback error: {0}")]
PlaybackError(#[from] PlaybackError),
}
impl ConnectionType {
pub(crate) fn connect(&self) -> io::Result<ServerHandle> {
let stream: ServerHandle = match self {
ConnectionType::Local(socket) => {
let name = socket.as_str().to_ns_name::<GenericNamespaced>()?;
let stream = local_socket::ConnectOptions::new()
.name(name)
.connect_sync()?;
Box::new(stream)
}
ConnectionType::Remote(socket_addr) => {
let stream = net::TcpStream::connect(socket_addr)?;
Box::new(stream)
}
};
Ok(stream)
}
}