pub mod archive;
pub mod error;
pub mod file;
pub mod source;
use error::Error;
use error::Result;
use axfive_libzip_sys as ffi;
#[cfg(test)]
mod tests {
use super::*;
use std::convert::TryInto;
use std::ffi::{CStr, CString};
use std::io::Read;
use std::string::String;
use tempdir::TempDir;
#[test]
fn round_trip() {
let tempdir = TempDir::new("test").unwrap();
let zip_path = CString::new(tempdir.path().join("file.zip").to_str().unwrap()).unwrap();
let foo = "Lorem ipsum dolor sit amet";
let bar = "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua";
let baz = "Ut enim ad minim veniam, quis nostrud exercitation";
{
let file_source: source::Source =
(&zip_path as &CStr).try_into().unwrap();
let mut archive = archive::Archive::open(
file_source,
[archive::OpenFlag::Create, archive::OpenFlag::Exclusive],
)
.unwrap();
let foo_source: source::Source = foo.as_bytes().try_into().unwrap();
archive
.add(
CString::new("foo").unwrap(),
foo_source,
file::Encoding::Guess,
file::Compression::Default,
None,
None,
false,
)
.unwrap();
let bar_source: source::Source = bar.as_bytes().try_into().unwrap();
archive
.add(
CString::new("bar").unwrap(),
bar_source,
file::Encoding::Guess,
file::Compression::Default,
None,
None,
false,
)
.unwrap();
let baz_source: source::Source = (Box::new(baz.as_bytes()) as Box<dyn std::io::Read>)
.try_into()
.unwrap();
archive
.add(
CString::new("baz").unwrap(),
baz_source,
file::Encoding::Guess,
file::Compression::Default,
None,
None,
false,
)
.unwrap();
archive.close().unwrap();
}
{
let file_source: source::Source =
(&zip_path as &CStr).try_into().unwrap();
let mut archive = archive::Archive::open(
file_source,
[
archive::OpenFlag::CheckConsistency,
archive::OpenFlag::ReadOnly,
],
)
.unwrap();
let mut foo_buf = String::new();
archive
.open_file(CString::new("foo").unwrap(), [], [])
.unwrap()
.read_to_string(&mut foo_buf)
.unwrap();
assert_eq!(foo_buf, foo);
let mut bar_buf = String::new();
archive
.open_file(CString::new("bar").unwrap(), [], [])
.unwrap()
.read_to_string(&mut bar_buf)
.unwrap();
assert_eq!(bar_buf, bar);
let mut baz_buf = String::new();
archive
.open_file(CString::new("baz").unwrap(), [], [])
.unwrap()
.read_to_string(&mut baz_buf)
.unwrap();
assert_eq!(baz_buf, baz);
archive.close().unwrap();
}
}
}