Reputation: 6353
Consider this code snippet:
use std::net::SocketAddr;
use tokio::sync::mpsc::{channel, Receiver, Sender}; // 0.1.22
use tokio::{net::TcpListener, prelude::*}; // 0.1.22
fn main() {
let addr = "127.0.0.1:8118".parse::<SocketAddr>().unwrap();
let listener = TcpListener::bind(&addr).expect("unable to bind");
let (sender, _): (Sender<char>, Receiver<char>) = channel(64);
tokio::run(
listener
.incoming()
.and_then(|s| tokio::io::read_to_end(s, vec![]))
.map_err(|e| panic!("failed: {:?}", e))
.for_each(move |(_socket, buf)| {
let s = sender.clone();
println!("Received: {:#?}", buf);
let c = buf[0] as char;
s.send(c).map_err(|e| panic!("failed: {:?}", e));
Ok(())
}),
);
}
When building, I get this warning:
warning: unused `futures::future::map_err::MapErr` that must be used
--> src/main.rs:19:17
|
19 | s.send(c).map_err(|e| panic!("failed: {:?}", e));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: #[warn(unused_must_use)] on by default
= note: futures do nothing unless polled
I assume I have to do something Tokio / async related, but I can't figure out what. I assumed that tokio::run
would handle all of the future related problems by running the code block within in the event loop, but it doesn't seem like it. Do I need to do something special in this case?
Upvotes: 1
Views: 569
Reputation: 431479
The same way as any "unused" warning: either use the value or delete it.
Here, use tokio::write_all
to write the first byte to the socket, returning a new future. This is called in an and_then
combinator:
use std::net::SocketAddr;
use tokio::sync::mpsc::{channel, Receiver, Sender}; // 0.1.22
use tokio::{net::TcpListener, prelude::*}; // 0.1.22
fn main() {
let addr = "127.0.0.1:8118".parse::<SocketAddr>().unwrap();
let listener = TcpListener::bind(&addr).expect("unable to bind");
let (sender, _): (Sender<char>, Receiver<char>) = channel(64);
tokio::run({
listener
.incoming()
.and_then(|s| tokio::io::read_to_end(s, vec![]))
.map_err(|e| panic!("failed: {:?}", e))
.inspect(|(_socket, buf)| println!("Received: {:#?}", buf))
.and_then(move |(_socket, buf)| {
let c = buf[0] as char;
sender.clone().send(c).map_err(|e| panic!("failed: {:?}", e))
})
.for_each(|_| Ok(()))
});
}
Upvotes: 2