quad-net 0.1.1

Miniquad friendly network abstractions
Documentation
use std::net::ToSocketAddrs;

mod error;

#[cfg(not(target_arch = "wasm32"))]
mod tcp;

use error::Error;

pub struct QuadSocket {
    #[cfg(not(target_arch = "wasm32"))]
    tcp_socket: tcp::TcpSocket,
    #[cfg(target_arch = "wasm32")]
    web_socket: crate::web_socket::js_web_socket::WebSocket,
}

impl QuadSocket {
    pub fn send(&mut self, data: &[u8]) {
        #[cfg(not(target_arch = "wasm32"))]
        {
            self.tcp_socket.send(data);
        }

        #[cfg(target_arch = "wasm32")]
        {
            self.web_socket.send(data);
        }
    }

    pub fn try_recv(&mut self) -> Option<Vec<u8>> {
        #[cfg(not(target_arch = "wasm32"))]
        {
            self.tcp_socket.try_recv()
        }

        #[cfg(target_arch = "wasm32")]
        {
            self.web_socket.try_recv()
        }
    }
}

#[cfg(feature = "nanoserde")]
impl QuadSocket {
    pub fn send_bin<T: nanoserde::SerBin>(&mut self, data: &T) {
        use nanoserde::SerBin;

        self.send(&SerBin::serialize_bin(data));
    }

    pub fn try_recv_bin<T: nanoserde::DeBin + std::fmt::Debug>(&mut self) -> Option<T> {
        let bytes = self.try_recv()?;
        let data: T = nanoserde::DeBin::deserialize_bin(&bytes).expect("Cant parse message");

        Some(data)
    }
}

impl QuadSocket {
    #[cfg(target_arch = "wasm32")]
    pub fn is_wasm_websocket_connected(&self) -> bool {
        self.web_socket.connected()
    }

    pub fn connect<A: ToSocketAddrs + std::fmt::Display>(addr: A) -> Result<QuadSocket, Error> {
        Ok(QuadSocket {
            #[cfg(not(target_arch = "wasm32"))]
            tcp_socket: tcp::TcpSocket::connect(addr)?,
            #[cfg(target_arch = "wasm32")]
            web_socket: websocket::WebSocket::connect(addr)?,
        })
    }
}