#ifndef PLANTSUNCAT_ZIP_H #define PLANTSUNCAT_ZIP_H #include "Core/Base/global_include.h" #include #include #include #include #include #include class Invalid_Archive_Error final : public std::runtime_error { public: using std::runtime_error::runtime_error; }; struct Archive_Directory_Layout_Rule { std::string directory; std::vector required_files; std::vector required_directories; std::vector optional_files; std::vector optional_directories; }; struct Archive_Layout_Rules { std::vector directories; std::size_t max_archive_size = 128 * 1024 * 1024; std::size_t max_entry_count = 16 * 1024; std::uint64_t max_entry_uncompressed_size = 256ULL * 1024 * 1024; std::uint64_t max_total_uncompressed_size = 512ULL * 1024 * 1024; }; struct Archive_Write_Options { std::string format = "zip"; std::string filter; std::string extension = "zip"; }; Psc::expected validate_archive_layout_from_memory( const char* data, std::size_t size, const Archive_Layout_Rules& rules ); void unarchive_file(const std::filesystem::path& zipPath, const std::filesystem::path& outDir); void unarchive_from_memory(const char* data, size_t size, const std::filesystem::path& outDir); void archive_directory( const std::filesystem::path& dirPath, const std::filesystem::path& archive_path, const Archive_Write_Options& options = {} ); // std::string zip_directory_to_memory(const std::filesystem::path& dirPath, // const std::vector& ignoreDirs); std::string archive_directory_to_memory( const std::filesystem::path& dirPath, const std::vector& ignorePatterns, const Archive_Write_Options& options = {} ); #endif