gnostr-cat 0.0.40

Command-line client for web sockets, like netcat/curl/socat for ws://.
Documentation
extern crate tokio_named_pipes;

//use super::{L2rUser, LeftSpecToRightSpec};
use std::cell::RefCell;
use std::io::{Read, Result as IoResult, Write};
use std::path::{Path, PathBuf};
use std::rc::Rc;

use tokio_io::{AsyncRead, AsyncWrite};
use tokio_named_pipes::NamedPipe;
use {futures, std};

use super::{once, BoxedNewPeerFuture, ConstructParams, Peer, PeerConstructor, Result, Specifier};

#[derive(Debug, Clone)]
pub struct NamedPipeConnect(pub PathBuf);
impl Specifier for NamedPipeConnect {
    fn construct(&self, _p: ConstructParams) -> PeerConstructor {
        once(
            Box::new(futures::future::result(named_pipe_connect_peer(&self.0)))
                as BoxedNewPeerFuture,
        )
    }
    specifier_boilerplate!(noglobalstate singleconnect no_subspec );
}
specifier_class!(
    name = NamedPipeConnectClass,
    target = NamedPipeConnect,
    prefixes = ["namedpipeconnect:"],
    arg_handling = into,
    overlay = false,
    StreamOriented,
    SingleConnect,
    help = r#"
Connect to a named pipe on Windows

Example:

    websocat ws-l:127.0.0.1:8000 namedpipeconnect:\\.\pipe\Pipe

"#
);

fn named_pipe_connect_peer(path: &Path) -> Result<Peer> {
    let pipe = NamedPipe::new(path, &tokio::reactor::Handle::default())?;
    let ph = NamedPipeConnectPeer(Rc::new(RefCell::new(pipe)));
    Ok(Peer::new(ph.clone(), ph, None))
}

#[derive(Clone)]
struct NamedPipeConnectPeer(Rc<RefCell<NamedPipe>>);

impl Read for NamedPipeConnectPeer {
    fn read(&mut self, buf: &mut [u8]) -> IoResult<usize> {
        self.0.borrow_mut().read(buf)
    }
}

impl Write for NamedPipeConnectPeer {
    fn write(&mut self, buf: &[u8]) -> IoResult<usize> {
        self.0.borrow_mut().write(buf)
    }

    fn flush(&mut self) -> IoResult<()> {
        self.0.borrow_mut().flush()
    }
}

impl AsyncRead for NamedPipeConnectPeer {}

impl AsyncWrite for NamedPipeConnectPeer {
    fn shutdown(&mut self) -> futures::Poll<(), std::io::Error> {
        self.0.borrow_mut().shutdown()
    }
}