Daniel Porteous
Daniel Porteous

Reputation: 6353

How to handle `unused futures::MapErr` warning?

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?

Playground link.

Upvotes: 1

Views: 569

Answers (1)

Shepmaster
Shepmaster

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

Related Questions