#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