@@ -435,7 +435,8 @@ pub fn Iterator(comptime SeekableStream: type) type {
435
435
uncompressed_size : u64 ,
436
436
file_offset : u64 ,
437
437
438
- /// Extract this entry. `extractor` must implement `openFile` and `openDir`.
438
+ /// Extract this entry. `extractor` must implement `createFile` and `createDir`.
439
+ /// The return type of `createFile` must implement `writer` and `close`.
439
440
/// See also `extract`.
440
441
pub fn extract_to (
441
442
self : Entry ,
@@ -534,8 +535,7 @@ pub fn Iterator(comptime SeekableStream: type) type {
534
535
if (filename [filename .len - 1 ] == '/' ) {
535
536
if (self .uncompressed_size != 0 )
536
537
return error .ZipBadDirectorySize ;
537
- var dir = try extractor .openDir (filename [0 .. filename .len - 1 ]);
538
- dir .close ();
538
+ try extractor .createDir (filename [0 .. filename .len - 1 ]);
539
539
return std .hash .Crc32 .hash (&.{});
540
540
}
541
541
@@ -545,7 +545,7 @@ pub fn Iterator(comptime SeekableStream: type) type {
545
545
local_data_header_offset ;
546
546
try stream .seekTo (local_data_file_offset );
547
547
var limited_reader = std .io .limitedReader (stream .context .reader (), self .compressed_size );
548
- var file = try extractor .openFile (filename );
548
+ var file = try extractor .createFile (filename );
549
549
defer file .close ();
550
550
const crc = try decompress (
551
551
self .compression_method ,
@@ -575,16 +575,11 @@ pub fn Iterator(comptime SeekableStream: type) type {
575
575
const FsExtractor = struct {
576
576
dest : std.fs.Dir ,
577
577
578
- const VirtualDir = struct {
579
- fn close (_ : VirtualDir ) void {}
580
- };
581
-
582
- fn openDir (self : @This (), name : []u8 ) ! VirtualDir {
578
+ fn createDir (self : @This (), name : []u8 ) ! void {
583
579
try self .dest .makePath (name );
584
- return VirtualDir {};
585
580
}
586
581
587
- fn openFile (self : @This (), name : []u8 ) ! std.fs.File {
582
+ fn createFile (self : @This (), name : []u8 ) ! std.fs.File {
588
583
if (std .fs .path .dirname (name )) | dirname | {
589
584
var parent_dir = try self .dest .makeOpenPath (dirname , .{});
590
585
defer parent_dir .close ();
@@ -726,29 +721,26 @@ test "zip verify filenames" {
726
721
try testZipError (error .ZipFilenameHasBackslash , .{ .name = "foo\\ bar" , .content = "" , .compression = .store }, .{});
727
722
}
728
723
729
- test "zip extract file to buffer " {
724
+ test "zip extract file to memory " {
730
725
const test_files = [_ ]File {
731
726
.{ .name = "a.txt" , .content = "aaa" , .compression = .store },
732
727
};
733
728
734
729
var extracted = std .ArrayList (u8 ).init (std .testing .allocator );
735
730
defer extracted .deinit ();
736
731
var extractor = struct {
737
- writer : ArrayList.Writer ,
732
+ writer : std . ArrayList ( u8 ) .Writer ,
738
733
739
- const ArrayList = std .ArrayList (u8 );
740
734
const Extractor = @This ();
741
735
const VirtualFile = struct {
742
736
context : * Extractor ,
743
- fn writer (self : @This ()) ArrayList.Writer {
737
+ fn writer (self : @This ()) std. ArrayList( u8 ) .Writer {
744
738
return self .context .writer ;
745
739
}
746
740
fn close (_ : @This ()) void {}
747
741
};
748
- fn openDir (_ : @This (), _ : []u8 ) ! VirtualFile {
749
- unreachable ;
750
- }
751
- fn openFile (self : * @This (), _ : []u8 ) ! VirtualFile {
742
+ fn createDir (_ : @This (), _ : []u8 ) ! void {}
743
+ fn createFile (self : * @This (), _ : []u8 ) ! VirtualFile {
752
744
return VirtualFile { .context = self };
753
745
}
754
746
}{ .writer = extracted .writer () };
0 commit comments