mirror of
https://github.com/tokio-rs/tokio.git
synced 2025-10-01 12:20:39 +00:00
tokio-fs: rewrite std echo example using async/await (#1442)
This PR fixes the echo example in tokio-fs. Refs: #1255
This commit is contained in:
parent
3b27dc31d2
commit
d0a8e5d6f2
34
tokio-fs/examples/std-echo.rs
Normal file
34
tokio-fs/examples/std-echo.rs
Normal file
@ -0,0 +1,34 @@
|
||||
//! Echo everything received on STDIN to STDOUT and STDERR.
|
||||
#![feature(async_await)]
|
||||
|
||||
use futures_util::{FutureExt, SinkExt, StreamExt, TryFutureExt};
|
||||
|
||||
use tokio::codec::{FramedRead, FramedWrite, LinesCodec, LinesCodecError};
|
||||
use tokio::future::ready;
|
||||
use tokio_fs::{stderr, stdin, stdout};
|
||||
use tokio_threadpool::Builder;
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
let pool = Builder::new().pool_size(1).build();
|
||||
|
||||
pool.spawn(
|
||||
async {
|
||||
let mut input = FramedRead::new(stdin(), LinesCodec::new());
|
||||
let mut output = FramedWrite::new(stdout(), LinesCodec::new());
|
||||
let mut error = FramedWrite::new(stderr(), LinesCodec::new());
|
||||
|
||||
while let Some(line) = input.next().await {
|
||||
let line = line?;
|
||||
output.send(format!("OUT: {}", line)).await?;
|
||||
error.send(format!("ERR: {}", line)).await?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
.map_err(|e: LinesCodecError| panic!(e))
|
||||
.then(|_| ready(())),
|
||||
);
|
||||
|
||||
pool.shutdown_on_idle().await;
|
||||
Ok(())
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
//! Echo everything received on STDIN to STDOUT.
|
||||
#![feature(async_await)]
|
||||
|
||||
use tokio_codec::{FramedRead, FramedWrite, LinesCodec};
|
||||
use tokio_fs::{stderr, stdin, stdout};
|
||||
use tokio_threadpool::Builder;
|
||||
|
||||
use futures_util::sink::SinkExt;
|
||||
|
||||
use std::io;
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
let pool = Builder::new().pool_size(1).build();
|
||||
|
||||
pool.spawn({
|
||||
let input = FramedRead::new(stdin(), LinesCodec::new());
|
||||
|
||||
let output = FramedWrite::new(stdout(), LinesCodec::new()).with(|line: String| {
|
||||
let mut out = "OUT: ".to_string();
|
||||
out.push_str(&line);
|
||||
Ok::<_, io::Error>(out)
|
||||
});
|
||||
|
||||
let error = FramedWrite::new(stderr(), LinesCodec::new()).with(|line: String| {
|
||||
let mut out = "ERR: ".to_string();
|
||||
out.push_str(&line);
|
||||
Ok::<_, io::Error>(out)
|
||||
});
|
||||
|
||||
let dst = output.fanout(error);
|
||||
|
||||
input
|
||||
.forward(dst)
|
||||
.map(|_| ())
|
||||
.map_err(|e| panic!("io error = {:?}", e))
|
||||
});
|
||||
|
||||
pool.shutdown_on_idle()
|
||||
.wait()
|
||||
.map_err(|_| "failed to shutdown the thread pool")?;
|
||||
Ok(())
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user