package extract import "archive/zip" func extractZip(archivePath string, writer *entryWriter) error { reader, err := zip.OpenReader(archivePath) if err != nil { return err } defer reader.Close() var declaredBytes uint64 for _, file := range reader.File { declaredBytes += file.UncompressedSize64 } if declaredBytes > uint64(writer.limits.MaxBytes) { return ErrTooLarge } writer.progress.SetTotal(int64(declaredBytes)) for _, file := range reader.File { if err := extractZipEntry(file, writer); err != nil { return err } } return nil } func extractZipEntry(file *zip.File, writer *entryWriter) error { mode := file.Mode() switch { case mode.IsDir(): return writer.writeDirectory(file.Name) case mode.IsRegular(): content, err := file.Open() if err != nil { return err } defer content.Close() return writer.writeFile(file.Name, content) default: return nil } }