Skip to content

Instantly share code, notes, and snippets.

@arthurprs
Forked from rrichardson/here.rs
Created October 13, 2016 18:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save arthurprs/9caa4894decb58686ec6ed3e5838b1df to your computer and use it in GitHub Desktop.
Save arthurprs/9caa4894decb58686ec6ed3e5838b1df to your computer and use it in GitHub Desktop.
#![feature(conservative_impl_trait)]
extern crate futures;
extern crate tokio_core;
use std::env;
use std::io;
use std::net::SocketAddr;
use futures::{Future, Poll, Async};
use futures::stream::Stream;
use tokio_core::io::{Io, WriteHalf, write_all};
use tokio_core::net::{TcpListener, TcpStream};
use tokio_core::reactor::{Core, Handle};
struct TestStream {
}
impl Stream for TestStream {
type Item = u32;
type Error = io::Error;
fn poll(&mut self) -> Poll<Option<Self::Item>, Self::Error> {
Ok(Async::Ready(Some(1)))
}
}
fn eat_tx(tx: WriteHalf<TcpStream>) -> impl Future<Item=WriteHalf<TcpStream>, Error=io::Error> {
let buffer = [1u8; 16];
write_all(tx, buffer).map(|(tx, _buffer)| tx)
}
fn reply(tx: WriteHalf<TcpStream>, hdl: Handle) -> Box<Future<Item = (), Error = io::Error>> {
let s = TestStream {}
.fold(tx, |tx, _| {
eat_tx(tx)
})
.then(|_| Ok(()));
hdl.spawn(s);
futures::done(Ok(())).boxed()
}
fn main() {
let addr = env::args().nth(1).unwrap_or("127.0.0.1:8080".to_string());
let addr = addr.parse::<SocketAddr>().unwrap();
let mut l = Core::new().unwrap();
let handle = l.handle();
let socket = TcpListener::bind(&addr, &handle).unwrap();
println!("Listening on: {}", addr);
let done = socket.incoming().for_each(move |(socket, addr)| {
let handle1 = handle.clone();
let pair = futures::lazy(|| futures::finished(socket.split()));
let amt = pair.and_then(move |(reader, mut writer)| {
let t = futures::done(Ok(())).and_then(move |x| reply(writer, handle1));
Ok(())
});
handle.spawn(amt);
Ok(())
});
l.run(done).unwrap();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment