Skip to content

Commit 53fb748

Browse files
authored
Add IFlate struct giving access to uncompressed data (#31)
* Add IFlate struct giving access to uncompressed data Some tests aren't passing yet. I think it is because I'm using write_all instead of io::copy * Remove encoder.flush() fixes some tests * Remove CompressionMethod FromStr impl * Use apply_compression fixing remaining tests * Make fields private * Store a slice ref not a vec
1 parent 8a877cd commit 53fb748

File tree

12 files changed

+119
-8
lines changed

12 files changed

+119
-8
lines changed

compress/src/lib.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ impl fmt::Display for FlateCompressionError {
5757
}
5858
}
5959

60-
#[derive(Debug, Copy, Clone)]
60+
#[derive(Debug, Copy, Clone, PartialEq)]
6161
pub enum CompressionMethod {
6262
#[cfg(feature = "deflate")]
6363
Deflate,
@@ -95,6 +95,17 @@ impl Default for CompressionMethod {
9595
}
9696
}
9797

98+
impl ToString for CompressionMethod {
99+
fn to_string(&self) -> String {
100+
match self {
101+
#[cfg(feature = "deflate")]
102+
Self::Deflate => "deflate".to_owned(),
103+
#[cfg(feature = "zstd")]
104+
Self::Zstd => "zstd".to_owned(),
105+
}
106+
}
107+
}
108+
98109
pub enum FlateEncoder<W: Write> {
99110
#[cfg(feature = "deflate")]
100111
Deflate(DeflateEncoder<W>),

src/lib.rs

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@
2929
/// The low-level macros used by this crate.
3030
pub use include_flate_codegen as codegen;
3131
use include_flate_compress::apply_decompression;
32+
use std::string::FromUtf8Error;
3233

33-
#[doc(hidden)]
3434
pub use include_flate_compress::CompressionMethod;
3535

3636
/// This macro is like [`include_bytes!`][1] or [`include_str!`][2], but compresses at compile time
@@ -117,6 +117,51 @@ macro_rules! flate {
117117
$crate::decode_string($crate::codegen::deflate_utf8_file!($path $($algo)?), Some($crate::CompressionMethodTy(algo)))
118118
});
119119
};
120+
($(#[$meta:meta])*
121+
$(pub $(($($vis:tt)+))?)? static $name:ident: IFlate from $path:literal $(with $algo:ident)?) => {
122+
// HACK: workaround to make cargo auto rebuild on modification of source file
123+
const _: &'static [u8] = include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/", $path));
124+
125+
$(#[$meta])*
126+
$(pub $(($($vis)+))?)? static $name: ::std::sync::LazyLock<$crate::IFlate> = ::std::sync::LazyLock::new(|| {
127+
let algo = match stringify!($($algo)?){
128+
"deflate" => $crate::CompressionMethod::Deflate,
129+
"zstd" => $crate::CompressionMethod::Zstd,
130+
_ => $crate::CompressionMethod::default(),
131+
};
132+
let compressed = $crate::codegen::deflate_file!($path $($algo)?);
133+
$crate::IFlate::new(compressed, algo)
134+
});
135+
};
136+
}
137+
138+
#[derive(Debug)]
139+
pub struct IFlate {
140+
compressed: &'static [u8],
141+
algo: CompressionMethod,
142+
}
143+
144+
impl IFlate {
145+
#[doc(hidden)]
146+
pub fn new(compressed: &'static [u8], algo: CompressionMethod) -> Self {
147+
Self { compressed, algo }
148+
}
149+
150+
pub fn compressed(&self) -> &[u8] {
151+
&self.compressed
152+
}
153+
154+
pub fn decoded(&self) -> Vec<u8> {
155+
decode(&self.compressed, Some(CompressionMethodTy(self.algo)))
156+
}
157+
158+
pub fn decode_string(&self) -> Result<String, FromUtf8Error> {
159+
String::from_utf8(self.decoded())
160+
}
161+
162+
pub fn algo(&self) -> CompressionMethod {
163+
self.algo
164+
}
120165
}
121166

122167
#[derive(Debug)]

test_util.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,19 @@ pub fn verify_str(name: &str, data: &str) {
7070
data
7171
);
7272
}
73+
74+
pub fn verify_iflate<P: AsRef<Path>>(name: P, method: CompressionMethod, iflate: &include_flate::IFlate) {
75+
assert_eq!(iflate.algo(), method);
76+
let path = get_file_path(None, &name);
77+
let mut file = File::open(&path).unwrap();
78+
let mut file_buffer = Vec::new();
79+
file.read_to_end(&mut file_buffer).unwrap();
80+
let mut source = std::io::Cursor::new(file_buffer);
81+
let mut compressed_buffer = Vec::new();
82+
{
83+
let mut compressed_cursor = std::io::Cursor::new(&mut compressed_buffer);
84+
apply_compression(&mut source, &mut compressed_cursor, method).unwrap();
85+
compressed_cursor.seek(SeekFrom::Start(0)).unwrap(); // Reset cursor position
86+
}
87+
assert_eq!(&iflate.compressed(), &compressed_buffer);
88+
}

tests/009f.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,14 @@ use include_flate::flate;
2020
flate!(pub static DATA1: [u8] from "assets/009f.dat");
2121
flate!(pub static DATA2: [u8] from "assets/009f.dat" with deflate);
2222
flate!(pub static DATA3: [u8] from "assets/009f.dat" with zstd);
23+
flate!(pub static DATA4: IFlate from "assets/009f.dat" with deflate);
24+
flate!(pub static DATA5: IFlate from "assets/009f.dat" with zstd);
2325

2426
#[test]
2527
fn test() {
2628
verify("009f.dat", &DATA1);
2729
verify("009f.dat", &DATA2);
2830
verify("009f.dat", &DATA3);
31+
verify_iflate("009f.dat", CompressionMethod::Deflate, &DATA4);
32+
verify_iflate("009f.dat", CompressionMethod::Zstd, &DATA5);
2933
}

tests/ascii-control.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,17 @@ include!("../test_util.rs");
1717

1818
use include_flate::flate;
1919

20-
flate!(pub static DATA1: str from "assets/ascii-printable.txt");
21-
flate!(pub static DATA2: str from "assets/ascii-printable.txt" with deflate);
22-
flate!(pub static DATA3: str from "assets/ascii-printable.txt" with zstd);
20+
flate!(pub static DATA1: str from "assets/ascii-control.txt");
21+
flate!(pub static DATA2: str from "assets/ascii-control.txt" with deflate);
22+
flate!(pub static DATA3: str from "assets/ascii-control.txt" with zstd);
23+
flate!(pub static DATA4: IFlate from "assets/ascii-control.txt" with deflate);
24+
flate!(pub static DATA5: IFlate from "assets/ascii-control.txt" with zstd);
2325

2426
#[test]
2527
fn test() {
26-
verify_str("ascii-printable.txt", &DATA1);
27-
verify_str("ascii-printable.txt", &DATA2);
28-
verify_str("ascii-printable.txt", &DATA3);
28+
verify_str("ascii-control.txt", &DATA1);
29+
verify_str("ascii-control.txt", &DATA2);
30+
verify_str("ascii-control.txt", &DATA3);
31+
verify_iflate("ascii-control.txt", CompressionMethod::Deflate, &DATA4);
32+
verify_iflate("ascii-control.txt", CompressionMethod::Zstd, &DATA5);
2933
}

tests/ascii-printable.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,14 @@ use include_flate::flate;
2020
flate!(pub static DATA1: str from "assets/ascii-printable.txt");
2121
flate!(pub static DATA2: str from "assets/ascii-printable.txt" with deflate);
2222
flate!(pub static DATA3: str from "assets/ascii-printable.txt" with zstd);
23+
flate!(pub static DATA4: IFlate from "assets/ascii-printable.txt" with deflate);
24+
flate!(pub static DATA5: IFlate from "assets/ascii-printable.txt" with zstd);
2325

2426
#[test]
2527
fn test() {
2628
verify_str("ascii-printable.txt", &DATA1);
2729
verify_str("ascii-printable.txt", &DATA2);
2830
verify_str("ascii-printable.txt", &DATA3);
31+
verify_iflate("ascii-printable.txt", CompressionMethod::Deflate, &DATA4);
32+
verify_iflate("ascii-printable.txt", CompressionMethod::Zstd, &DATA5);
2933
}

tests/base64.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,20 @@ include!("../test_util.rs");
1717

1818
use include_flate::flate;
1919

20+
pub static DATA_RAW: &[u8] =
21+
include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/assets/base64.txt"));
22+
2023
flate!(pub static DATA1: str from "assets/base64.txt");
2124
flate!(pub static DATA2: str from "assets/base64.txt" with deflate);
2225
flate!(pub static DATA3: str from "assets/base64.txt" with zstd);
26+
flate!(pub static DATA4: IFlate from "assets/base64.txt" with deflate);
27+
flate!(pub static DATA5: IFlate from "assets/base64.txt" with zstd);
2328

2429
#[test]
2530
fn test() {
2631
verify_str("base64.txt", &DATA1);
2732
verify_str("base64.txt", &DATA2);
2833
verify_str("base64.txt", &DATA3);
34+
verify_iflate("base64.txt", CompressionMethod::Deflate, &DATA4);
35+
verify_iflate("base64.txt", CompressionMethod::Zstd, &DATA5);
2936
}

tests/chinese.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,14 @@ use include_flate::flate;
2020
flate!(pub static DATA1: str from "assets/chinese.txt");
2121
flate!(pub static DATA2: str from "assets/chinese.txt" with deflate);
2222
flate!(pub static DATA3: str from "assets/chinese.txt" with zstd);
23+
flate!(pub static DATA4: IFlate from "assets/chinese.txt" with deflate);
24+
flate!(pub static DATA5: IFlate from "assets/chinese.txt" with zstd);
2325

2426
#[test]
2527
fn test() {
2628
verify_str("chinese.txt", &DATA1);
2729
verify_str("chinese.txt", &DATA2);
2830
verify_str("chinese.txt", &DATA3);
31+
verify_iflate("chinese.txt", CompressionMethod::Deflate, &DATA4);
32+
verify_iflate("chinese.txt", CompressionMethod::Zstd, &DATA5);
2933
}

tests/emoji.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,14 @@ use include_flate::flate;
2020
flate!(pub static DATA1: str from "assets/emoji.txt");
2121
flate!(pub static DATA2: str from "assets/emoji.txt" with deflate);
2222
flate!(pub static DATA3: str from "assets/emoji.txt" with zstd);
23+
flate!(pub static DATA4: IFlate from "assets/emoji.txt" with deflate);
24+
flate!(pub static DATA5: IFlate from "assets/emoji.txt" with zstd);
2325

2426
#[test]
2527
fn test() {
2628
verify_str("emoji.txt", &DATA1);
2729
verify_str("emoji.txt", &DATA2);
2830
verify_str("emoji.txt", &DATA3);
31+
verify_iflate("emoji.txt", CompressionMethod::Deflate, &DATA4);
32+
verify_iflate("emoji.txt", CompressionMethod::Zstd, &DATA5);
2933
}

tests/ff.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,14 @@ use include_flate::flate;
2020
flate!(pub static DATA1: [u8] from "assets/ff.dat");
2121
flate!(pub static DATA2: [u8] from "assets/ff.dat" with deflate);
2222
flate!(pub static DATA3: [u8] from "assets/ff.dat" with zstd);
23+
flate!(pub static DATA4: IFlate from "assets/ff.dat" with deflate);
24+
flate!(pub static DATA5: IFlate from "assets/ff.dat" with zstd);
2325

2426
#[test]
2527
fn test() {
2628
verify("ff.dat", &DATA1);
2729
verify("ff.dat", &DATA2);
2830
verify("ff.dat", &DATA3);
31+
verify_iflate("ff.dat", CompressionMethod::Deflate, &DATA4);
32+
verify_iflate("ff.dat", CompressionMethod::Zstd, &DATA5);
2933
}

0 commit comments

Comments
 (0)