1#![allow(non_upper_case_globals)]
2#![allow(non_camel_case_types)]
3#![allow(non_snake_case)]
4
5include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
6
7impl AllocatedMemory {
8 pub fn to_err(mut self: Self) -> Result<Vec<u8>, Option<String>> {
9 let raw = if self.data.is_null() {
10 None
11 } else {
12 let mut data = vec![];
13 let slice = unsafe { std::slice::from_raw_parts(self.data, self.length) };
14 data.extend(slice);
15 Some(data)
16 };
17 unsafe { clean(&mut self) };
18
19 match (self.status >= 0, raw) {
20 (true, Some(d)) => Ok(d),
21 (_, Some(other)) => Err(Some(other.into_iter().map(|b| b as char).collect())),
22 (_, None) => Err(None),
23 }
24 }
25}
26
27pub const AL_GREENLEAF_LEVEL_0: u8 = 0;
28pub const AL_GREENLEAF_LEVEL_1: u8 = 1;
29pub const AL_GREENLEAF_LEVEL_2: u8 = 2;
30pub const AL_GREENLEAF_LEVEL_3: u8 = 3;
31pub const AL_GREENLEAF_LEVEL_4: u8 = 4;
32
33pub fn do_compress(input: &[u8]) -> Result<Box<[u8]>, std::string::String> {
34 do_compress_level(input, AL_GREENLEAF_LEVEL_0)
35}
36
37pub fn do_compress_level(
38 input: &[u8],
39 compression_level: u8,
40) -> Result<Box<[u8]>, std::string::String> {
41 let mut data = {
42 let mut v = vec![];
43 v.extend(input.iter());
44 v.into_boxed_slice()
45 };
46 let length = data.len();
47 let ptr = data.as_mut_ptr();
48 unsafe { compress(ptr, length, compression_level) }
49 .to_err()
50 .map(|v| v.into_boxed_slice())
51 .map_err(|o| o.unwrap_or("".to_string()))
52}
53pub fn do_decompress(input: &[u8]) -> Result<Box<[u8]>, std::string::String> {
54 do_decompress_level(input, AL_GREENLEAF_LEVEL_0)
55}
56pub fn do_decompress_level(
57 input: &[u8],
58 compression_level: u8,
59) -> Result<Box<[u8]>, std::string::String> {
60 let mut data = {
61 let mut v = vec![];
62 v.extend(input.iter());
63 v.into_boxed_slice()
64 };
65 let length = data.len();
66 let ptr = data.as_mut_ptr();
67 unsafe { decompress(ptr, length, compression_level) }
68 .to_err()
69 .map(|v| v.into_boxed_slice())
70 .map_err(|o| o.unwrap_or("".to_string()))
71}