@@ -625,16 +625,38 @@ impl<CV: CVSource> CVIndex<CV> {
625625 flate2:: Compression :: fast ( ) ,
626626 ) ;
627627 std:: io:: copy ( & mut encoder, & mut writer)
628-
629- // response
630- // .copy_to(&mut writer)
631- // // .map(|_| ())
632- // .map_err(|e| e.to_string())
633-
634- // Ok(0)
635628 }
636629 crate :: CVCompression :: Lzw => {
637- todo ! ( )
630+ use crate :: lzw:: ZArchive ;
631+
632+ let content = ZArchive :: new ( response. as_ref ( ) )
633+ . and_then ( |mut a| a. read ( ) )
634+ . map_err ( |e| {
635+ use crate :: lzw:: { self , ArchiveError } ;
636+
637+ BoxedError :: new (
638+ CVError :: FileCouldNotBeParsed ,
639+ "Could not decompress Lzw compression" ,
640+ match e {
641+ ArchiveError :: DecompressionFailed { entry, reason } => {
642+ format ! ( "{entry} {reason}" )
643+ }
644+ ArchiveError :: InvalidHeader => format ! (
645+ "Invalid header, the first bytes have to be {:x}{:x}" ,
646+ lzw:: ID [ 0 ] ,
647+ lzw:: ID [ 1 ]
648+ ) ,
649+ ArchiveError :: IO ( io) => io. to_string ( ) ,
650+ } ,
651+ Context :: none ( ) . source ( url. to_string ( ) ) . to_owned ( ) ,
652+ )
653+ } ) ?;
654+
655+ let mut encoder = flate2:: bufread:: GzEncoder :: new (
656+ BufReader :: new ( content. as_slice ( ) ) ,
657+ flate2:: Compression :: fast ( ) ,
658+ ) ;
659+ std:: io:: copy ( & mut encoder, & mut writer)
638660 }
639661 }
640662 . map_err ( |e| {
0 commit comments