Decrease memory usage in ARMv7 CI
[ouch.git] / src / archive / rar.rs
blobc08ec5834b261b9c61b6d3f5b33a6f6e00a01d67
1 //! Contains RAR-specific building and unpacking functions
3 use std::path::Path;
5 use unrar::{self, Archive};
7 use crate::{info, list::FileInArchive, warning};
9 /// Unpacks the archive given by `archive_path` into the folder given by `output_folder`.
10 /// Assumes that output_folder is empty
11 pub fn unpack_archive(archive_path: &Path, output_folder: &Path, quiet: bool) -> crate::Result<usize> {
12     assert!(output_folder.read_dir().expect("dir exists").count() == 0);
14     let mut archive = Archive::new(archive_path).open_for_processing()?;
15     let mut unpacked = 0;
17     while let Some(header) = archive.read_header()? {
18         let entry = header.entry();
19         archive = if entry.is_file() {
20             if !quiet {
21                 info!(
22                     inaccessible,
23                     "{} extracted. ({})",
24                     entry.filename.display(),
25                     entry.unpacked_size
26                 );
27             }
28             unpacked += 1;
29             header.extract_with_base(output_folder)?
30         } else {
31             header.skip()?
32         };
33     }
35     Ok(unpacked)
38 /// List contents of `archive_path`, returning a vector of archive entries
39 pub fn list_archive(archive_path: &Path) -> impl Iterator<Item = crate::Result<FileInArchive>> {
40     Archive::new(archive_path)
41         .open_for_listing()
42         .expect("cannot open archive")
43         .map(|item| {
44             let item = item?;
45             let is_dir = item.is_directory();
46             let path = item.filename;
48             Ok(FileInArchive { path, is_dir })
49         })
52 pub fn no_compression_notice() {
53     const MESSAGE: &str = "Creating '.rar' archives is not supported due to licensing restrictions";
55     warning!("{}", MESSAGE);