66
77use bytes:: Bytes ;
88use 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" ) ]
918use std:: io:: Read ;
10- use thiserror:: Error ;
1119
1220/// Size of the compression header in bytes (1 byte flag + 8 bytes original size)
1321const COMPRESSION_HEADER_SIZE : usize = 9 ;
@@ -19,20 +27,20 @@ const FLAG_UNCOMPRESSED: u8 = 0x00;
1927const FLAG_ZSTD : u8 = 0x01 ;
2028
2129/// Compression-related errors
22- #[ derive( Debug , Error ) ]
30+ #[ derive( Debug , Snafu ) ]
2331pub enum CompressionError {
24- #[ error ( "invalid compression header" ) ]
32+ #[ snafu ( display ( "invalid compression header" ) ) ]
2533 InvalidHeader ,
2634
27- #[ error ( "invalid compression flag: {0}" ) ]
28- InvalidCompressionFlag ( u8 ) ,
35+ #[ snafu ( display ( "invalid compression flag: {flag}" ) ) ]
36+ InvalidCompressionFlag { flag : u8 } ,
2937
30- #[ error ( "decompression failed: {0}" ) ]
31- DecompressionFailed ( String ) ,
38+ #[ snafu ( display ( "decompression failed: {message}" ) ) ]
39+ DecompressionFailed { message : String } ,
3240}
3341
3442/// 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 > ;
3644
3745/// Information about a compressed blob
3846#[ derive( Debug , Clone ) ]
@@ -65,7 +73,7 @@ fn parse_compression_header(blob: &[u8]) -> Result<(u8, u64, &[u8])> {
6573
6674 // Validate the compression flag
6775 if flag != FLAG_UNCOMPRESSED && flag != FLAG_ZSTD {
68- return Err ( CompressionError :: InvalidCompressionFlag ( flag) ) ;
76+ return Err ( CompressionError :: InvalidCompressionFlag { flag } ) ;
6977 }
7078
7179 Ok ( ( flag, original_size, payload) )
@@ -99,7 +107,7 @@ pub fn decompress_blob(compressed_blob: &[u8]) -> Result<Bytes> {
99107 }
100108
101109 // Otherwise, it's likely a corrupted compressed blob
102- return Err ( CompressionError :: InvalidCompressionFlag ( flag) ) ;
110+ return Err ( CompressionError :: InvalidCompressionFlag { flag } ) ;
103111 }
104112
105113 // Parse the header
@@ -112,28 +120,35 @@ pub fn decompress_blob(compressed_blob: &[u8]) -> Result<Bytes> {
112120 }
113121 FLAG_ZSTD => {
114122 // 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+ } ) ?;
117128
118129 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+ } ) ?;
122135
123136 // Verify the decompressed size matches
124137 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+ } ) ;
130145 }
131146
132147 Ok ( Bytes :: from ( decompressed) )
133148 }
134149 _ => {
135150 // Should not happen as we validated the flag earlier
136- Err ( CompressionError :: InvalidCompressionFlag ( flag) )
151+ Err ( CompressionError :: InvalidCompressionFlag { flag } )
137152 }
138153 }
139154}
@@ -216,7 +231,7 @@ mod tests {
216231 assert ! ( result. is_err( ) ) ;
217232
218233 match result. unwrap_err ( ) {
219- CompressionError :: InvalidCompressionFlag ( flag) => {
234+ CompressionError :: InvalidCompressionFlag { flag } => {
220235 assert_eq ! ( flag, 0xFF ) ;
221236 }
222237 _ => panic ! ( "Expected InvalidCompressionFlag error" ) ,
0 commit comments