Configuration API ​
The Configuration API provides flexible, client-side customization of compression settings through the builder pattern.
CompressionConfig ​
zig
pub const CompressionConfig = struct {
algorithm: Algorithm,
level: Level,
custom_level: ?u8,
zstd_level: ?c_int,
lz4_level: ?c_int,
buffer_size: usize,
memory_level: u8,
window_size: u32,
strategy: Strategy,
checksum: bool,
keep_original: bool,
recursive: bool,
follow_symlinks: bool,
max_depth: ?usize,
min_file_size: ?usize,
max_file_size: ?usize,
include_patterns: []const FilterRule,
exclude_patterns: []const FilterRule,
dictionary: ?[]const u8,
pub fn init(algorithm: Algorithm) CompressionConfig
pub fn withLevel(self: CompressionConfig, level: Level) CompressionConfig
pub fn withCustomLevel(self: CompressionConfig, level: u8) CompressionConfig
pub fn withZstdLevel(self: CompressionConfig, level: c_int) CompressionConfig
pub fn withLz4Level(self: CompressionConfig, level: c_int) CompressionConfig
pub fn withBufferSize(self: CompressionConfig, size: usize) CompressionConfig
pub fn withMemoryLevel(self: CompressionConfig, level: u8) CompressionConfig
pub fn withWindowSize(self: CompressionConfig, size: u32) CompressionConfig
pub fn withStrategy(self: CompressionConfig, strategy: Strategy) CompressionConfig
pub fn withChecksum(self: CompressionConfig) CompressionConfig
pub fn withKeepOriginal(self: CompressionConfig) CompressionConfig
pub fn withRecursive(self: CompressionConfig, recursive: bool) CompressionConfig
pub fn withFollowSymlinks(self: CompressionConfig) CompressionConfig
pub fn withMaxDepth(self: CompressionConfig, depth: ?usize) CompressionConfig
pub fn withSizeRange(self: CompressionConfig, min_size: ?usize, max_size: ?usize) CompressionConfig
pub fn includeFiles(self: CompressionConfig, patterns: []const []const u8) CompressionConfig
pub fn excludeFiles(self: CompressionConfig, patterns: []const []const u8) CompressionConfig
pub fn includeDirectories(self: CompressionConfig, patterns: []const []const u8, recursive: bool) CompressionConfig
pub fn excludeDirectories(self: CompressionConfig, patterns: []const []const u8, recursive: bool) CompressionConfig
pub fn withIncludePatterns(self: CompressionConfig, rules: []const FilterRule) CompressionConfig
pub fn withExcludePatterns(self: CompressionConfig, rules: []const FilterRule) CompressionConfig
pub fn withDictionary(self: CompressionConfig, dictionary: []const u8) CompressionConfig
pub fn shouldIncludePath(self: CompressionConfig, path: []const u8, is_directory: bool) bool
};Initialization ​
Basic Initialization ​
zig
// Initialize with algorithm
const config = archive.CompressionConfig.init(.zstd);Chained Configuration ​
zig
const config = archive.CompressionConfig.init(.zstd)
.withZstdLevel(15)
.withChecksum()
.withBufferSize(256 * 1024);Compression Levels ​
Level Enum ​
zig
pub const Level = enum {
fastest, // Level 1
fast, // Level 3
default, // Level 6
best, // Level 9
};Setting Levels ​
zig
// Preset levels
const config = archive.CompressionConfig.init(.gzip)
.withLevel(.best);
// Custom level (0-9 for most algorithms)
const config = archive.CompressionConfig.init(.gzip)
.withCustomLevel(7);
// ZSTD-specific level (1-22)
const config = archive.CompressionConfig.init(.zstd)
.withZstdLevel(19);
// LZ4-specific level (1-12)
const config = archive.CompressionConfig.init(.lz4)
.withLz4Level(8);Performance Configuration ​
Buffer Management ​
zig
const config = archive.CompressionConfig.init(.gzip)
.withBufferSize(128 * 1024) // 128KB buffer
.withMemoryLevel(8) // Memory usage level (1-9)
.withWindowSize(32768); // Compression window sizeCompression Strategy ​
zig
pub const Strategy = enum {
default,
filtered,
huffman_only,
rle,
fixed,
};
const config = archive.CompressionConfig.init(.gzip)
.withStrategy(.huffman_only); // Huffman-only compressionFile Filtering ​
FilterRule Structure ​
zig
pub const FilterRule = struct {
pattern: []const u8,
is_directory: bool,
case_sensitive: bool,
is_recursive: bool,
};Simple File Patterns ​
zig
const config = archive.CompressionConfig.init(.gzip)
.includeFiles(&[_][]const u8{ "*.zig", "*.md", "*.json" })
.excludeFiles(&[_][]const u8{ "*.tmp", "*.log", "*.cache" });Directory Patterns ​
zig
const config = archive.CompressionConfig.init(.gzip)
.includeDirectories(&[_][]const u8{ "src/**", "docs/**" }, true)
.excludeDirectories(&[_][]const u8{ ".git/**", "node_modules/**" }, true);Advanced Filter Rules ​
zig
const include_rules = [_]archive.FilterRule{
.{ .pattern = "src/**", .is_directory = true, .case_sensitive = true, .is_recursive = true },
.{ .pattern = "*.zig", .is_directory = false, .case_sensitive = true, .is_recursive = false },
};
const exclude_rules = [_]archive.FilterRule{
.{ .pattern = "*.tmp", .is_directory = false, .case_sensitive = false, .is_recursive = false },
.{ .pattern = "build/**", .is_directory = true, .case_sensitive = true, .is_recursive = true },
};
const config = archive.CompressionConfig.init(.zstd)
.withIncludePatterns(&include_rules)
.withExcludePatterns(&exclude_rules);Directory Traversal ​
Traversal Options ​
zig
const config = archive.CompressionConfig.init(.gzip)
.withRecursive(true) // Enable recursive traversal
.withFollowSymlinks() // Follow symbolic links
.withMaxDepth(5) // Limit traversal depth
.withSizeRange(1024, 10 * 1024 * 1024); // File size range (1KB to 10MB)Quality Options ​
Integrity and Preservation ​
zig
const config = archive.CompressionConfig.init(.zstd)
.withChecksum() // Enable checksum verification
.withKeepOriginal(); // Keep original files after compressionDictionary Compression ​
zig
const dictionary = "common words and phrases used in the data";
const config = archive.CompressionConfig.init(.zstd)
.withDictionary(dictionary);Configuration Examples ​
Development Configuration ​
zig
pub fn developmentConfig() archive.CompressionConfig {
return archive.CompressionConfig.init(.lz4)
.withLevel(.fastest)
.excludeFiles(&[_][]const u8{ "*.tmp", "*.log", "*.obj", "*.exe" })
.excludeDirectories(&[_][]const u8{ ".git/**", "zig-cache/**", "zig-out/**" }, true)
.withRecursive(true)
.withMaxDepth(10)
.withBufferSize(64 * 1024);
}Production Configuration ​
zig
pub fn productionConfig() archive.CompressionConfig {
return archive.CompressionConfig.init(.zstd)
.withZstdLevel(15)
.withChecksum()
.withKeepOriginal()
.excludeDirectories(&[_][]const u8{ ".git/**", "node_modules/**", "target/**" }, true)
.withSizeRange(1, null) // Exclude empty files
.withRecursive(true)
.withBufferSize(512 * 1024)
.withMemoryLevel(9);
}Archive Configuration ​
zig
pub fn archiveConfig() archive.CompressionConfig {
return archive.CompressionConfig.init(.lzma)
.withLevel(.best)
.withChecksum()
.withFollowSymlinks()
.withSizeRange(0, null) // No size limits
.withMaxDepth(null) // No depth limits
.withBufferSize(1024 * 1024)
.withMemoryLevel(9);
}Memory-Efficient Configuration ​
zig
pub fn memoryEfficientConfig() archive.CompressionConfig {
return archive.CompressionConfig.init(.lz4)
.withLevel(.fastest)
.withBufferSize(32 * 1024) // Small buffer
.withMemoryLevel(4) // Low memory usage
.withRecursive(false); // Avoid deep recursion
}Path Filtering Methods ​
shouldIncludePath ​
zig
pub fn shouldIncludePath(self: CompressionConfig, path: []const u8, is_directory: bool) boolDetermines whether a path should be included based on the configuration rules.
Example:
zig
const config = archive.CompressionConfig.init(.gzip)
.includeFiles(&[_][]const u8{ "*.zig" })
.excludeFiles(&[_][]const u8{ "*.tmp" });
const should_include = config.shouldIncludePath("src/main.zig", false);
// Returns true
const should_exclude = config.shouldIncludePath("temp.tmp", false);
// Returns falsePattern Matching ​
Supported Patterns ​
*- Match any characters**- Match any characters including path separators (recursive)?- Match single character[abc]- Match any character in brackets[!abc]- Match any character not in brackets
Pattern Examples ​
zig
const patterns = [_][]const u8{
"*.txt", // All .txt files
"src/**/*.zig", // All .zig files in src and subdirectories
"test_*.zig", // Files starting with "test_"
"**/*.md", // All .md files anywhere
"build/**", // Everything in build directory
};Validation ​
Configuration Validation ​
zig
pub fn validateConfig(config: archive.CompressionConfig) !void {
// Validate buffer size
if (config.buffer_size < 1024) {
return error.BufferTooSmall;
}
// Validate ZSTD level
if (config.algorithm == .zstd) {
if (config.zstd_level) |level| {
if (level < 1 or level > 22) {
return error.InvalidZstdLevel;
}
}
}
// Validate LZ4 level
if (config.algorithm == .lz4) {
if (config.lz4_level) |level| {
if (level < 1 or level > 12) {
return error.InvalidLz4Level;
}
}
}
// Validate memory level
if (config.memory_level < 1 or config.memory_level > 9) {
return error.InvalidMemoryLevel;
}
}Configuration Utilities ​
Configuration Merging ​
zig
pub fn mergeConfigs(base: archive.CompressionConfig, override: archive.CompressionConfig) archive.CompressionConfig {
var result = base;
// Override non-default values
if (override.level != .default) result.level = override.level;
if (override.custom_level != null) result.custom_level = override.custom_level;
if (override.zstd_level != null) result.zstd_level = override.zstd_level;
if (override.lz4_level != null) result.lz4_level = override.lz4_level;
if (override.buffer_size != 0) result.buffer_size = override.buffer_size;
if (override.checksum) result.checksum = true;
if (override.keep_original) result.keep_original = true;
return result;
}Configuration Serialization ​
zig
pub fn configToJson(allocator: std.mem.Allocator, config: archive.CompressionConfig) ![]u8 {
return std.json.stringifyAlloc(allocator, config, .{});
}
pub fn configFromJson(allocator: std.mem.Allocator, json: []const u8) !archive.CompressionConfig {
const parsed = try std.json.parseFromSlice(archive.CompressionConfig, allocator, json, .{});
defer parsed.deinit();
return parsed.value;
}Best Practices ​
Configuration Guidelines ​
- Start with algorithm selection - Choose based on your use case
- Set appropriate levels - Balance compression vs speed
- Configure buffers wisely - Larger buffers = better compression, more memory
- Use filtering effectively - Exclude unnecessary files early
- Test configurations - Benchmark on representative data
- Document configurations - Make settings clear for team members
- Validate inputs - Check configuration validity before use
Common Configurations ​
zig
// Fast compression for development
const fast_config = archive.CompressionConfig.init(.lz4)
.withLevel(.fastest);
// Balanced compression for general use
const balanced_config = archive.CompressionConfig.init(.zstd)
.withZstdLevel(6);
// Maximum compression for archival
const max_config = archive.CompressionConfig.init(.lzma)
.withLevel(.best);
// Web-optimized compression
const web_config = archive.CompressionConfig.init(.gzip)
.withLevel(.default)
.withStrategy(.huffman_only);Next Steps ​
- Learn about Algorithm for algorithm-specific details
- Explore Compressor for advanced compression control
- Check Utils for configuration utilities
- See Examples for practical configuration usage
