diff --git a/src/drivers/crates_io.rs b/src/drivers/crates_io.rs index 68f04e82..fa1a8063 100644 --- a/src/drivers/crates_io.rs +++ b/src/drivers/crates_io.rs @@ -71,6 +71,5 @@ pub async fn fetch_crate_cratesio( TarBasedFmt::Tgz, ManifestVisitor::new(manifest_dir_path), ) - .await? - .load_manifest() + .await } diff --git a/src/drivers/crates_io/visitor.rs b/src/drivers/crates_io/visitor.rs index 3f354771..0eb7bd6c 100644 --- a/src/drivers/crates_io/visitor.rs +++ b/src/drivers/crates_io/visitor.rs @@ -29,23 +29,11 @@ impl ManifestVisitor { vfs: Vfs::new(), } } - - /// Load binstall metadata using the extracted information stored in memory. - pub(super) fn load_manifest(&self) -> Result, BinstallError> { - debug!("Loading manifest directly from extracted file"); - - // Load and parse manifest - let mut manifest = Manifest::::from_slice_with_metadata(&self.cargo_toml_content)?; - - // Checks vfs for binary output names - manifest.complete_from_abstract_filesystem(&self.vfs)?; - - // Return metadata - Ok(manifest) - } } impl TarEntriesVisitor for ManifestVisitor { + type Target = Manifest; + fn visit(&mut self, entries: Entries<'_, R>) -> Result<(), BinstallError> { for res in entries { let mut entry = res?; @@ -78,4 +66,18 @@ impl TarEntriesVisitor for ManifestVisitor { Ok(()) } + + /// Load binstall metadata using the extracted information stored in memory. + fn finish(self) -> Result { + debug!("Loading manifest directly from extracted file"); + + // Load and parse manifest + let mut manifest = Manifest::from_slice_with_metadata(&self.cargo_toml_content)?; + + // Checks vfs for binary output names + manifest.complete_from_abstract_filesystem(&self.vfs)?; + + // Return metadata + Ok(manifest) + } } diff --git a/src/helpers.rs b/src/helpers.rs index 55edc19a..18794acb 100644 --- a/src/helpers.rs +++ b/src/helpers.rs @@ -130,16 +130,16 @@ pub async fn download_tar_based_and_visit Result { +) -> Result { let stream = create_request(url).await?; debug!("Downloading and extracting then in-memory processing"); - let visitor = extract_tar_based_stream_and_visit(stream, fmt, visitor).await?; + let ret = extract_tar_based_stream_and_visit(stream, fmt, visitor).await?; debug!("Download, extraction and in-memory procession OK"); - Ok(visitor) + Ok(ret) } /// Fetch install path from environment diff --git a/src/helpers/async_extracter.rs b/src/helpers/async_extracter.rs index 5a7ef9c1..9986c48a 100644 --- a/src/helpers/async_extracter.rs +++ b/src/helpers/async_extracter.rs @@ -99,20 +99,17 @@ where /// Visitor must iterate over all entries. /// Entires can be in arbitary order. pub trait TarEntriesVisitor { - fn visit(&mut self, entries: Entries<'_, R>) -> Result<(), BinstallError>; -} + type Target; -impl TarEntriesVisitor for &mut V { - fn visit(&mut self, entries: Entries<'_, R>) -> Result<(), BinstallError> { - (*self).visit(entries) - } + fn visit(&mut self, entries: Entries<'_, R>) -> Result<(), BinstallError>; + fn finish(self) -> Result; } pub async fn extract_tar_based_stream_and_visit( stream: S, fmt: TarBasedFmt, mut visitor: V, -) -> Result +) -> Result where S: Stream> + Unpin + 'static, V: TarEntriesVisitor + Debug + Send + 'static, @@ -124,6 +121,6 @@ where let mut tar = create_tar_decoder(reader, fmt)?; visitor.visit(tar.entries()?)?; - Ok(visitor) + visitor.finish() }) }