How to use tonic's `serve_with_shutdown`

Tonic's test's has this snippet:

 let (tx, rx) = oneshot::channel::<()>();
 let jh = tokio::spawn(async move {

My questions are:

  1. what is drop here?
  2. can I use broadcast or mpsc here instead of oneshot?
  3. for tokio 1.9.0, oneshot::Receiver<> self implemetes Future, can I use it directly?

As far as I understand serve_with_shutdown will serve requests until the future returns a value (in this case the receiver side of a oneshot channel)

In case of an mpsc channel you will need to .recv() to get a future.

The .map(|_| ()) is necessary to turn a future returning Result<(), RecvError> into one returning ().

I tried to use|_| ()), but compiler complains that another trait is not satisfied.

57  |             _ = grpc_server.serve_with_shutdown(self.addr,|_| ())) => {
    |                                                               ^^^ method cannot be called on `tokio::sync::oneshot::Receiver<()>` due to unsatisfied trait bounds
   ::: /Users/zp/.cargo/registry/src/
124 | pub struct Receiver<T> {
    | ---------------------- doesn't satisfy `tokio::sync::oneshot::Receiver<()>: Iterator`
    = note: the following trait bounds were not satisfied:
            `tokio::sync::oneshot::Receiver<()>: Iterator`
            which is required by `&mut tokio::sync::oneshot::Receiver<()>: Iterator`
    = help: items from traits can only be used if the trait is in scope
    = note: the following trait is implemented but not in scope; perhaps add a `use` for it:
            `use futures_util::future::future::FutureExt;`

Add use futures_util::FutureExt; in the beginning to introduce necessary traits. Solved.

The problem is that it was trying to use the wrong map function.