impl Uploading {
#[throws(MgmtError)]
- pub fn bulk<R>(self, data: &mut R, expected: &Hash,
- for_progress: &mut dyn progress::Reporter) -> Uploaded
- where R: Read
+ pub fn bulk<R,PW>(self, data: &mut R, expected: &Hash,
+ for_progress: &mut ResponseWriter<PW>) -> Uploaded
+ where R: Read, PW: Write
{
+ let mut for_progress = progress::ResponseReporter::new(for_progress);
+
let Uploading { id, mut file, instance } = self;
let tmp = id.path_tmp(&instance);
let mut file = BufReader::new(file);
let parsed = parse_bundle(id, &mut file, BundleParseUpload,
- for_progress)?;
+ &mut for_progress)?;
- process_bundle(id, &*instance, for_progress)?;
+ process_bundle(id, &*instance, &mut for_progress)?;
Uploaded { id, parsed }
}
// There is NO WARRANTY.
use crate::prelude::*;
-use crate::packetframe::ResponseWriter;
#[derive(Debug,Clone,Serialize,Deserialize,IntoOwned)]
pub struct ProgressInfo<'pi> {
pub trait Reporter {
fn report(&mut self, info: ProgressInfo<'_>);
+ fn phase_begin_(&mut self, phase: Count<'_>, len: usize);
+ fn item_(&mut self, entry: usize, desc: Cow<'_, str>);
}
-impl<W> Reporter for ResponseWriter<'_, W> where W: Write {
+pub struct ResponseReporter<'c,'w,W> where W: Write {
+ chan: &'c mut ResponseWriter<'w,W>,
+ phase: Count<'static>,
+ len: usize,
+}
+impl<'c,'w,W> ResponseReporter<'c,'w,W> where W: Write {
+ pub fn new(chan: &'c mut ResponseWriter<'w,W>) -> Self { Self {
+ chan,
+ phase: Count { i:0, n:0, desc: Cow::Borrowed("") },
+ len: 0,
+ } }
+}
+
+impl<W> Reporter for ResponseReporter<'_,'_,W> where W: Write {
fn report(&mut self, pi: ProgressInfo<'_>) {
- self.progress(pi).unwrap_or(());
+ self.chan.progress(pi).unwrap_or(());
+ }
+ fn phase_begin_(&mut self, phase: Count<'_>, len: usize) {
+ self.phase = phase.into_owned();
+ self.len = len;
+ }
+ fn item_(&mut self, entry: usize, desc: Cow<'_, str>) {
+ self.report(ProgressInfo {
+ phase: self.phase.clone(),
+ entry: Count { i: entry, n: self.len, desc }
+ })
}
}
+#[allow(unused_variables)]
impl Reporter for () {
- fn report(&mut self, _pi: ProgressInfo<'_>) { }
+ fn report(&mut self, pi: ProgressInfo<'_>) { }
+ fn phase_begin_(&mut self, phase: Count<'_>, len: usize) { }
+ fn item_(&mut self, entry: usize, desc: Cow<'_, str>) { }
}
impl<'t,T> From<&'t T> for Count<'t>
let entry = &entry; let entry = entry.into();
self.report(ProgressInfo { phase, entry });
}
+
+ fn phase_begin<P>(&mut self, phase: P, len: usize)
+ where for <'p> &'p P: Into<Count<'p>>,
+ {
+ self.phase_begin_((&phase).into(), len)
+ }
+
+ fn item<'s,S>(&mut self, entry: usize, desc: S)
+ where S: Into<Cow<'s, str>>,
+ {
+ self.item_(entry, desc.into())
+ }
}