SizedTransfer

Struct SizedTransfer 

Source
pub struct SizedTransfer<R, W>
where R: Read + Send + 'static, W: Write + Send + 'static,
{ /* private fields */ }
Expand description

Monitors the progress of a transfer with a known size.

Implementations§

Source§

impl<R, W> SizedTransfer<R, W>
where R: Read + Send + 'static, W: Write + Send + 'static,

Source

pub fn new(reader: R, writer: W, size: u64) -> Self

Creates and starts a new SizedTransfer.

§Example
use transfer_progress::SizedTransfer;
use std::fs::File;
use std::io::Read;
let reader = File::open("file1.txt")?.take(1024); // Bytes
let writer = File::create("file2.txt")?;
let transfer = SizedTransfer::new(reader, writer, 1024);
Examples found in repository?
examples/sized_copy.rs (line 16)
11fn main() -> io::Result<()> {
12    let reader = File::open("/dev/urandom")?.take(DATA_TO_TRANSFER);
13    let writer = io::sink();
14
15    // Create the transfer monitor
16    let transfer = SizedTransfer::new(reader, writer, DATA_TO_TRANSFER);
17
18    while !transfer.is_complete() {
19        std::thread::sleep(std::time::Duration::from_secs(1));
20        // {:#} makes Transfer use SI units (MiB instead of MB)
21        println!("{:#}", transfer);
22    }
23
24    // Catch any errors and retrieve the reader and writer
25    let (_reader, _writer) = transfer.finish()?;
26    Ok(())
27}
Source

pub fn size(&self) -> u64

Returns the total size (in bytes) of the transfer, as specified when calling new.

§Example
use transfer_progress::SizedTransfer;
use std::fs::File;
use std::io::Read;
let reader = File::open("file1.txt")?.take(1024); // Bytes
let writer = File::create("file2.txt")?;
let transfer = SizedTransfer::new(reader, writer, 1024);
assert_eq!(transfer.size(), 1024);
Source

pub fn remaining(&self) -> u64

Returns the number of bytes remaining.

§Example
use transfer_progress::SizedTransfer;
use std::fs::File;
use std::io::Read;
let reader = File::open("file1.txt")?.take(1024); // Bytes
let writer = File::create("file2.txt")?;
let transfer = SizedTransfer::new(reader, writer, 1024);
while !transfer.is_complete() {
println!("{} bytes remaining", transfer.remaining());
std::thread::sleep(std::time::Duration::from_secs(1));
}
Source

pub fn finish(self) -> Result<(R, W)>

Consumes the SizedTransfer, blocking until the transfer is complete.

If the transfer was successful, returns Ok(reader, writer), otherwise returns the error.

If the transfer is already complete, returns immediately.

§Example
use transfer_progress::SizedTransfer;
use std::fs::File;
use std::io::Read;
let reader = File::open("file1.txt")?.take(1024); // Bytes
let writer = File::create("file2.txt")?;
let transfer = SizedTransfer::new(reader, writer, 1024);
let (reader, writer) = transfer.finish()?;
Examples found in repository?
examples/sized_copy.rs (line 25)
11fn main() -> io::Result<()> {
12    let reader = File::open("/dev/urandom")?.take(DATA_TO_TRANSFER);
13    let writer = io::sink();
14
15    // Create the transfer monitor
16    let transfer = SizedTransfer::new(reader, writer, DATA_TO_TRANSFER);
17
18    while !transfer.is_complete() {
19        std::thread::sleep(std::time::Duration::from_secs(1));
20        // {:#} makes Transfer use SI units (MiB instead of MB)
21        println!("{:#}", transfer);
22    }
23
24    // Catch any errors and retrieve the reader and writer
25    let (_reader, _writer) = transfer.finish()?;
26    Ok(())
27}
Source

pub fn fraction_transferred(&self) -> f64

Returns a fraction between 0.0 and 1.0 representing the state of the transfer.

§Example
use transfer_progress::SizedTransfer;
use std::fs::File;
use std::io::Read;
let reader = File::open("file1.txt")?.take(1024); // Bytes
let writer = File::create("file2.txt")?;
let transfer = SizedTransfer::new(reader, writer, 1024);
while !transfer.is_complete() {
println!("Transfer is {:.0}% complete", transfer.fraction_transferred() * 100.0);
std::thread::sleep(std::time::Duration::from_secs(1));
}
Source

pub fn eta(&self) -> Option<Duration>

Returns the approximate remaining time until this transfer completes. Returns None if this cannot be calculated (I.E. no bytes have been transferred yet, so a speed cannot be determined).

§Example
use transfer_progress::SizedTransfer;
use std::fs::File;
use std::io::Read;
let reader = File::open("file1.txt")?.take(1024); // Bytes
let writer = File::create("file2.txt")?;
let transfer = SizedTransfer::new(reader, writer, 1024);
while !transfer.is_complete() {
if let Some(eta) = transfer.eta() {
println!("Transfer will complete in approximately {:?}", eta);
} else {
println!("Transfer completion time is unknown");
}
std::thread::sleep(std::time::Duration::from_secs(1));
}

Methods from Deref<Target = Transfer<R, W>>§

Source

pub fn is_complete(&self) -> bool

Tests if the transfer is complete

§Example
use transfer_progress::Transfer;
use std::fs::File;
let reader = File::open("file1.txt")?;
let writer = File::create("file2.txt")?;
let transfer = Transfer::new(reader, writer);
while !transfer.is_complete() {
println!("Not complete yet");
std::thread::sleep(std::time::Duration::from_secs(1));
}
println!("Complete!");
Examples found in repository?
examples/copy.rs (line 15)
8fn main() -> io::Result<()> {
9    let reader = File::open("/dev/urandom")?.take(1024 * 1024 * 1024); // 1 GiB
10    let writer = io::sink();
11
12    // Create the transfer monitor
13    let transfer = Transfer::new(reader, writer);
14
15    while !transfer.is_complete() {
16        std::thread::sleep(std::time::Duration::from_secs(1));
17        // {:#} makes Transfer use SI units (MiB instead of MB)
18        println!("{:#}", transfer);
19    }
20
21    // Catch any errors and retrieve the reader and writer
22    let (_reader, _writer) = transfer.finish()?;
23    Ok(())
24}
More examples
Hide additional examples
examples/sized_copy.rs (line 18)
11fn main() -> io::Result<()> {
12    let reader = File::open("/dev/urandom")?.take(DATA_TO_TRANSFER);
13    let writer = io::sink();
14
15    // Create the transfer monitor
16    let transfer = SizedTransfer::new(reader, writer, DATA_TO_TRANSFER);
17
18    while !transfer.is_complete() {
19        std::thread::sleep(std::time::Duration::from_secs(1));
20        // {:#} makes Transfer use SI units (MiB instead of MB)
21        println!("{:#}", transfer);
22    }
23
24    // Catch any errors and retrieve the reader and writer
25    let (_reader, _writer) = transfer.finish()?;
26    Ok(())
27}
Source

pub fn transferred(&self) -> u64

Returns the number of bytes transferred thus far between the reader and the writer.

§Example
use transfer_progress::Transfer;
use std::fs::File;
let reader = File::open("file1.txt")?;
let writer = File::create("file2.txt")?;
let transfer = Transfer::new(reader, writer);
while !transfer.is_complete() {
println!("{} bytes transferred so far", transfer.transferred());
std::thread::sleep(std::time::Duration::from_secs(1));
}
println!("Complete!");
Source

pub fn running_time(&self) -> Duration

Returns the elapsed time since the transfer started.

§Example
use transfer_progress::Transfer;
use std::fs::File;
let reader = File::open("file1.txt")?;
let writer = File::create("file2.txt")?;
let transfer = Transfer::new(reader, writer);
while !transfer.is_complete() {}
println!("Transfer took {:?}", transfer.running_time());
Source

pub fn speed(&self) -> u64

Returns the average speed, in bytes per second, of the transfer.

§Example
use transfer_progress::Transfer;
use std::fs::File;
let reader = File::open("file1.txt")?;
let writer = File::create("file2.txt")?;
let transfer = Transfer::new(reader, writer);
while !transfer.is_complete() {
println!("{}B/s", transfer.speed());
std::thread::sleep(std::time::Duration::from_secs(1));
}

Trait Implementations§

Source§

impl<R, W> Debug for SizedTransfer<R, W>
where R: Read + Send + 'static, W: Write + Send + 'static,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<R, W> Deref for SizedTransfer<R, W>
where R: Read + Send + 'static, W: Write + Send + 'static,

Source§

type Target = Transfer<R, W>

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.
Source§

impl<R, W> Display for SizedTransfer<R, W>
where R: Read + Send + 'static, W: Write + Send + 'static,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<R, W> Freeze for SizedTransfer<R, W>

§

impl<R, W> !RefUnwindSafe for SizedTransfer<R, W>

§

impl<R, W> Send for SizedTransfer<R, W>

§

impl<R, W> Sync for SizedTransfer<R, W>

§

impl<R, W> Unpin for SizedTransfer<R, W>

§

impl<R, W> !UnwindSafe for SizedTransfer<R, W>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.