use alloc::vec::Vec;
use crate::{
error::{DisconnectionError, RecvError, RunError, SendError},
websocket::WebSocket,
};
use async_tungstenite::tokio::{ConnectStream, TokioAdapter};
use future_form::Sendable;
use futures::future::BoxFuture;
use subduction_core::transport::Transport;
use tokio::net::TcpStream;
#[derive(Debug, Clone)]
pub enum UnifiedWebSocket {
Accepted(WebSocket<TokioAdapter<TcpStream>, Sendable>),
Dialed(WebSocket<ConnectStream, Sendable>),
}
impl UnifiedWebSocket {
pub async fn listen(&self) -> Result<(), RunError> {
match self {
UnifiedWebSocket::Accepted(in_ws) => in_ws.listen().await,
UnifiedWebSocket::Dialed(out_ws) => out_ws.listen().await,
}
}
}
impl Transport<Sendable> for UnifiedWebSocket {
type SendError = SendError;
type RecvError = RecvError;
type DisconnectionError = DisconnectionError;
fn disconnect(&self) -> BoxFuture<'_, Result<(), Self::DisconnectionError>> {
match self {
UnifiedWebSocket::Accepted(in_ws) => Transport::<Sendable>::disconnect(in_ws),
UnifiedWebSocket::Dialed(out_ws) => Transport::<Sendable>::disconnect(out_ws),
}
}
fn send_bytes(&self, bytes: &[u8]) -> BoxFuture<'_, Result<(), Self::SendError>> {
match self {
UnifiedWebSocket::Accepted(in_ws) => Transport::<Sendable>::send_bytes(in_ws, bytes),
UnifiedWebSocket::Dialed(out_ws) => Transport::<Sendable>::send_bytes(out_ws, bytes),
}
}
fn recv_bytes(&self) -> BoxFuture<'_, Result<Vec<u8>, Self::RecvError>> {
match self {
UnifiedWebSocket::Accepted(in_ws) => Transport::<Sendable>::recv_bytes(in_ws),
UnifiedWebSocket::Dialed(out_ws) => Transport::<Sendable>::recv_bytes(out_ws),
}
}
}
impl PartialEq for UnifiedWebSocket {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(UnifiedWebSocket::Accepted(a), UnifiedWebSocket::Accepted(b)) => a == b,
(UnifiedWebSocket::Dialed(a), UnifiedWebSocket::Dialed(b)) => a == b,
_ => false,
}
}
}