Skip to content

Commit c1eeb4e

Browse files
authored
add progress indicator to fileio[CPP-314] (#128)
1 parent 66607c0 commit c1eeb4e

File tree

2 files changed

+41
-9
lines changed

2 files changed

+41
-9
lines changed

console_backend/src/bin/fileio.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,16 @@ fn main() -> Result<()> {
7474
scope(|s| {
7575
s.spawn(|_| run(rdr));
7676
let mut fileio = Fileio::new(link, sender);
77-
let data = fs::File::open(source)?;
78-
fileio.overwrite(dest, data)?;
79-
eprintln!("file written successfully.");
77+
let file = fs::File::open(source)?;
78+
let size = file.metadata()?.len() as usize;
79+
let mut bytes_written = 0;
80+
eprint!("\rWriting 0.0%...");
81+
fileio.overwrite_with_progress(dest, file, |n| {
82+
bytes_written += n;
83+
let progress = (bytes_written as f64) / (size as f64) * 100.0;
84+
eprint!("\rWriting {:.2}%...", progress);
85+
})?;
86+
eprintln!("\nFile written successfully.");
8087
done_tx.send(true).unwrap();
8188
Result::Ok(())
8289
})
@@ -122,7 +129,7 @@ fn main() -> Result<()> {
122129
s.spawn(|_| run(rdr));
123130
let fileio = Fileio::new(link, sender);
124131
fileio.remove(path)?;
125-
eprintln!("file deleted.");
132+
eprintln!("File deleted.");
126133
done_tx.send(true).unwrap();
127134
Result::Ok(())
128135
})

console_backend/src/fileio.rs

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,21 @@ impl<'a> Fileio<'a> {
155155
/// This operation is NOT atomic. If the write fails and `filename` existed, it is gone forever.
156156
/// For more context see: https://github.com/swift-nav/console_pp/pull/72#discussion_r654751414
157157
pub fn overwrite(&mut self, filename: String, data: impl Read) -> Result<()> {
158+
self.overwrite_with_progress(filename, data, |_| ())
159+
}
160+
161+
/// Deletes `filename` on the remote device (if it exists) and writes the contents of `data` to the file.
162+
/// This operation is NOT atomic. If the write fails and `filename` existed, it is gone forever.
163+
/// For more context see: https://github.com/swift-nav/console_pp/pull/72#discussion_r654751414
164+
pub fn overwrite_with_progress<'b, F>(
165+
&mut self,
166+
filename: String,
167+
data: impl Read,
168+
mut on_progress: F,
169+
) -> Result<()>
170+
where
171+
F: FnMut(usize) + 'b,
172+
{
158173
self.remove(filename.clone())?;
159174

160175
let mut data = BufReader::new(data);
@@ -166,14 +181,22 @@ impl<'a> Fileio<'a> {
166181
if bytes_read == 0 {
167182
break;
168183
}
169-
state = self.write_slice(state, buf)?;
184+
state = self.write_slice(state, buf, &mut on_progress)?;
170185
data.consume(bytes_read);
171186
}
172187

173188
Ok(())
174189
}
175190

176-
fn write_slice(&mut self, mut state: WriteState, data: &[u8]) -> Result<WriteState> {
191+
fn write_slice<'b, F>(
192+
&mut self,
193+
mut state: WriteState,
194+
data: &[u8],
195+
on_progress: &mut F,
196+
) -> Result<WriteState>
197+
where
198+
F: FnMut(usize) + 'b,
199+
{
177200
let config = self.fetch_config();
178201

179202
let (req_tx, req_rx) = channel::unbounded();
@@ -234,9 +257,11 @@ impl<'a> Fileio<'a> {
234257
},
235258
recv(res_rx) -> msg => {
236259
let msg = msg?;
237-
if pending.remove(&msg.sequence).is_none() {
238-
continue
239-
}
260+
let req = match pending.remove(&msg.sequence) {
261+
Some((_, req)) => req,
262+
_ => continue,
263+
};
264+
on_progress(req.end_offset - req.offset);
240265
open_requests.fetch_sub(1);
241266
if last_sent && open_requests.load() == 0 {
242267
break;

0 commit comments

Comments
 (0)