1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
use crate::net::Listen; use crate::net::NetStream; use std::net::{SocketAddr, ToSocketAddrs}; use std::io::{self}; use queen_io::tcp::TcpListener; use queen_io::unix::UnixListener; use queen_io::tcp::TcpStream; use queen_io::unix::UnixStream; use nson::{Message, msg}; use crate::dict::*; #[derive(Debug, Clone)] pub enum Addr { Tcp(SocketAddr), Uds(String) } impl Addr { pub fn tcp<A: ToSocketAddrs>(addr: A) -> io::Result<Addr> { let mut addr = addr.to_socket_addrs()?; Ok(Addr::Tcp(addr.next().expect("can't paser addr!"))) } pub fn uds(path: String) -> Addr { Addr::Uds(path) } pub fn is_tcp(&self) -> bool { if let Addr::Tcp(_) = self { return true } false } pub fn bind(&self) -> io::Result<Listen> { match self { Addr::Tcp(addr) => Ok(Listen::Tcp(TcpListener::bind(addr)?)), Addr::Uds(addr) => Ok(Listen::Uds(UnixListener::bind(addr)?)) } } pub fn connect(&self) -> io::Result<NetStream> { match self { Addr::Tcp(addr) => { let socket = TcpStream::connect(addr)?; socket.set_nodelay(true)?; Ok(NetStream::Tcp(socket)) } Addr::Uds(path) => { let socket = UnixStream::connect(path)?; Ok(NetStream::Uds(socket)) } } } pub fn to_message(&self) -> Message { match self { Addr::Tcp(addr) => { msg!{ ADDR_TYPE: "TCP", ADDR: addr.to_string() } } Addr::Uds(addr) => { msg!{ ADDR_TYPE: "UDS", ADDR: addr } } } } }