High-level wrapper around the unrar C library provided by rarlab.
This library can only extract and list archives, it cannot create them.
Please look inside the examples directory to see how to use this library. Specifically the lister example is well documented and advanced!
Basic example to list archive entries:
```rust,no_run use unrar::Archive;
fn main() { for entry in Archive::new("archive.rar").openforlisting().unwrap() { println!("{}", entry.unwrap()); } } ```
Run this example: cargo run --example basic_list path/to/archive.rar
.
You can create an archive by using the rar
CLI: rar a archive.rar .
The primary type in this crate is [Archive
]
which denotes an archive on the file system. Archive
itself makes no
FS operations, unless one of the open
methods are called, returning
an [OpenArchive
].
The [Archive
] struct provides two major classes of methods:
.part08.rar
or .r08.rar
. Since extracting
must start at the first part, it may be helpful to figure that out using, for instance,
archive.as_first_part()
List
], [ListSplit
] and [Process
]).
These methods have the word open
in them, are fallible operations,
return [OpenArchive
] inside a Result
and are as follows:
- open_for_listing
and
open_for_listing_split
: list the archive
entries (skipping over content/payload)
- open_for_processing
: process archive entries
as well as content/payload
- break_open
: read archive even if an error is returned,
if possible. The [OpenMode
] must be provided
explicitly.An archive is opened in one of these three modes: [List
], [ListSplit
] or [Process
].
This library does not provide random access into archives. Instead, files inside the archive
can only be processed as a stream, unidirectionally, front to back, alternating between
[ReadHeader
] and [ProcessFile
] operations (as dictated by the underlying C++ library).
That is the idea behind cursors:
Via cursors, the archive keeps track what operation is permitted next:
- [CursorBeforeHeader
] -> [ReadHeader
]
- [CursorBeforeFile
] -> [ProcessFile
]
The library enforces this by making
use of the typestate pattern. An archive, once
opened, starts in the CursorBeforeHeader
state and, thus, must have its [read_header
] method
called, which returns a new OpenArchive
instance in the CursorBeforeFile
state that only
exposes methods that internally map to the ProcessFile
operation.
Which methods are accessible in each step depends on the archive's current state and the
mode it was opened in.
Here is an overview of what methods are exposed for the OpenMode/Cursor combinations:
| Open mode↓ ╲ Cursor position→| before header | before file |
|------------------------------|-----------------|------------------------------------------------------------------------|
| [List
], [ListSplit
] | [read_header
] | [skip
] |
| [Process
] | [read_header
] | [skip
], [read
], [extract
], [extract_to
], [extract_with_base
] |
Archives opened in [List
] or [ListSplit
] mode also implement [Iterator
] whereas archives in
[Process
] mode do not (though this may change in future releases). That is because the first
two will read and return headers while being forced to skip over the payload whereas the latter
has more sophisticated processing possibilities that's not easy to convey using an [Iterator
].
For more sophisticated examples, please look inside the examples/
folder.
Here's what a function that returns the first content of a file could look like:
```rust
fn firstfilecontent
#
```
As this library is only a wrapper, these following features are not easily feasible and as such not planned:
Feel free to contribute! If you detect a bug, open an issue.
Pull requests are also welcome!
If you need help using the library, feel free to create a new discussion or open an issue.
While this crate uses the MIT license for the Rust parts, the embedded C++ library has a different license.
For more informations, see its license file.