mod password_list;
mod rar;
mod sevenz;
mod shared;
mod zip;
#[allow(clippy::unwrap_used, clippy::expect_used)]
#[cfg(test)]
mod tests;
pub use password_list::PasswordList;
pub use rar::RarExtractor;
pub use sevenz::SevenZipExtractor;
pub use shared::{detect_archive_type, extract_recursive, is_archive};
pub use zip::ZipExtractor;
use crate::db::Database;
use crate::error::{Error, PostProcessError, Result};
use crate::types::DownloadId;
use std::path::{Path, PathBuf};
use tracing::info;
pub async fn extract_archive(
download_id: DownloadId,
archive_path: &Path,
dest_path: &Path,
passwords: &PasswordList,
db: &Database,
) -> Result<Vec<PathBuf>> {
let archive_type = detect_archive_type(archive_path).ok_or_else(|| {
Error::PostProcess(PostProcessError::ExtractionFailed {
archive: archive_path.to_path_buf(),
reason: format!("unknown archive type for file: {}", archive_path.display()),
})
})?;
info!(
download_id = download_id.0,
?archive_path,
?archive_type,
"dispatching extraction to appropriate extractor"
);
match archive_type {
crate::types::ArchiveType::Rar => {
RarExtractor::extract_with_passwords(
download_id,
archive_path,
dest_path,
passwords,
db,
)
.await
}
crate::types::ArchiveType::SevenZip => {
SevenZipExtractor::extract_with_passwords(
download_id,
archive_path,
dest_path,
passwords,
db,
)
.await
}
crate::types::ArchiveType::Zip => {
ZipExtractor::extract_with_passwords(
download_id,
archive_path,
dest_path,
passwords,
db,
)
.await
}
}
}