diff --git a/rust/example_0003_copy_reader_to_writer/Cargo.lock b/rust/example_0003_copy_reader_to_writer/Cargo.lock new file mode 100644 index 0000000..380cf1b --- /dev/null +++ b/rust/example_0003_copy_reader_to_writer/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "example_0003_copy_reader_to_writer" +version = "0.1.0" diff --git a/rust/example_0003_copy_reader_to_writer/Cargo.toml b/rust/example_0003_copy_reader_to_writer/Cargo.toml new file mode 100644 index 0000000..caf3a20 --- /dev/null +++ b/rust/example_0003_copy_reader_to_writer/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "example_0003_copy_reader_to_writer" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/rust/example_0003_copy_reader_to_writer/src/lib.rs b/rust/example_0003_copy_reader_to_writer/src/lib.rs new file mode 100644 index 0000000..a2c8010 --- /dev/null +++ b/rust/example_0003_copy_reader_to_writer/src/lib.rs @@ -0,0 +1,21 @@ +use std::io::{Read, Write, self, ErrorKind}; + +const DEFAULT_BUFFER_SIZE: usize = 8 * 1024; + +pub fn copy(reader: &mut R, writer: &mut W) -> io::Result +where R: Read, W: Write +{ + let mut buf = [0; DEFAULT_BUFFER_SIZE]; + let mut written = 0; + + loop { + let len = match reader.read(&mut buf) { + Ok(0) => return Ok(written), + Ok(len) => len, + Err(ref e) if e.kind() == ErrorKind::Interrupted => continue, + Err(e) => return Err(e), + }; + writer.write_all(&buf[..len])?; + written += len as u64; + } +}