6
6
7
7
use bytes:: Bytes ;
8
8
use ruzstd:: decoding:: StreamingDecoder ;
9
+ use snafu:: Snafu ;
10
+
11
+ #[ cfg( not( feature = "std" ) ) ]
12
+ use alloc:: { format, string:: { String , ToString } , vec:: Vec } ;
13
+
14
+ #[ cfg( not( feature = "std" ) ) ]
15
+ use ruzstd:: io:: Read ;
16
+
17
+ #[ cfg( feature = "std" ) ]
9
18
use std:: io:: Read ;
10
- use thiserror:: Error ;
11
19
12
20
/// Size of the compression header in bytes (1 byte flag + 8 bytes original size)
13
21
const COMPRESSION_HEADER_SIZE : usize = 9 ;
@@ -19,20 +27,20 @@ const FLAG_UNCOMPRESSED: u8 = 0x00;
19
27
const FLAG_ZSTD : u8 = 0x01 ;
20
28
21
29
/// Compression-related errors
22
- #[ derive( Debug , Error ) ]
30
+ #[ derive( Debug , Snafu ) ]
23
31
pub enum CompressionError {
24
- #[ error ( "invalid compression header" ) ]
32
+ #[ snafu ( display ( "invalid compression header" ) ) ]
25
33
InvalidHeader ,
26
34
27
- #[ error ( "invalid compression flag: {0}" ) ]
28
- InvalidCompressionFlag ( u8 ) ,
35
+ #[ snafu ( display ( "invalid compression flag: {flag}" ) ) ]
36
+ InvalidCompressionFlag { flag : u8 } ,
29
37
30
- #[ error ( "decompression failed: {0}" ) ]
31
- DecompressionFailed ( String ) ,
38
+ #[ snafu ( display ( "decompression failed: {message}" ) ) ]
39
+ DecompressionFailed { message : String } ,
32
40
}
33
41
34
42
/// Result type for compression operations
35
- pub type Result < T > = std :: result:: Result < T , CompressionError > ;
43
+ pub type Result < T > = core :: result:: Result < T , CompressionError > ;
36
44
37
45
/// Information about a compressed blob
38
46
#[ derive( Debug , Clone ) ]
@@ -65,7 +73,7 @@ fn parse_compression_header(blob: &[u8]) -> Result<(u8, u64, &[u8])> {
65
73
66
74
// Validate the compression flag
67
75
if flag != FLAG_UNCOMPRESSED && flag != FLAG_ZSTD {
68
- return Err ( CompressionError :: InvalidCompressionFlag ( flag) ) ;
76
+ return Err ( CompressionError :: InvalidCompressionFlag { flag } ) ;
69
77
}
70
78
71
79
Ok ( ( flag, original_size, payload) )
@@ -99,7 +107,7 @@ pub fn decompress_blob(compressed_blob: &[u8]) -> Result<Bytes> {
99
107
}
100
108
101
109
// Otherwise, it's likely a corrupted compressed blob
102
- return Err ( CompressionError :: InvalidCompressionFlag ( flag) ) ;
110
+ return Err ( CompressionError :: InvalidCompressionFlag { flag } ) ;
103
111
}
104
112
105
113
// Parse the header
@@ -112,28 +120,35 @@ pub fn decompress_blob(compressed_blob: &[u8]) -> Result<Bytes> {
112
120
}
113
121
FLAG_ZSTD => {
114
122
// Decompress with ruzstd
115
- let mut decoder = StreamingDecoder :: new ( payload)
116
- . map_err ( |e| CompressionError :: DecompressionFailed ( e. to_string ( ) ) ) ?;
123
+ let mut decoder = StreamingDecoder :: new ( payload) . map_err ( |e| {
124
+ CompressionError :: DecompressionFailed {
125
+ message : format ! ( "{}" , e) ,
126
+ }
127
+ } ) ?;
117
128
118
129
let mut decompressed = Vec :: new ( ) ;
119
- decoder
120
- . read_to_end ( & mut decompressed)
121
- . map_err ( |e| CompressionError :: DecompressionFailed ( e. to_string ( ) ) ) ?;
130
+ decoder. read_to_end ( & mut decompressed) . map_err ( |e| {
131
+ CompressionError :: DecompressionFailed {
132
+ message : format ! ( "{}" , e) ,
133
+ }
134
+ } ) ?;
122
135
123
136
// Verify the decompressed size matches
124
137
if decompressed. len ( ) as u64 != original_size {
125
- return Err ( CompressionError :: DecompressionFailed ( format ! (
126
- "size mismatch: expected {}, got {}" ,
127
- original_size,
128
- decompressed. len( )
129
- ) ) ) ;
138
+ return Err ( CompressionError :: DecompressionFailed {
139
+ message : format ! (
140
+ "size mismatch: expected {}, got {}" ,
141
+ original_size,
142
+ decompressed. len( )
143
+ ) ,
144
+ } ) ;
130
145
}
131
146
132
147
Ok ( Bytes :: from ( decompressed) )
133
148
}
134
149
_ => {
135
150
// Should not happen as we validated the flag earlier
136
- Err ( CompressionError :: InvalidCompressionFlag ( flag) )
151
+ Err ( CompressionError :: InvalidCompressionFlag { flag } )
137
152
}
138
153
}
139
154
}
@@ -216,7 +231,7 @@ mod tests {
216
231
assert ! ( result. is_err( ) ) ;
217
232
218
233
match result. unwrap_err ( ) {
219
- CompressionError :: InvalidCompressionFlag ( flag) => {
234
+ CompressionError :: InvalidCompressionFlag { flag } => {
220
235
assert_eq ! ( flag, 0xFF ) ;
221
236
}
222
237
_ => panic ! ( "Expected InvalidCompressionFlag error" ) ,
0 commit comments