Skip to main content

agentic_workflow/format/
compression.rs

1#[cfg(feature = "format")]
2use lz4_flex::{compress_prepend_size, decompress_size_prepended};
3
4use crate::types::{WorkflowError, WorkflowResult};
5
6/// Compress data using LZ4.
7#[cfg(feature = "format")]
8pub fn compress(data: &[u8]) -> Vec<u8> {
9    compress_prepend_size(data)
10}
11
12/// Decompress LZ4 data.
13#[cfg(feature = "format")]
14pub fn decompress(data: &[u8]) -> WorkflowResult<Vec<u8>> {
15    decompress_size_prepended(data)
16        .map_err(|e| WorkflowError::FormatError(format!("Decompression failed: {}", e)))
17}
18
19/// No-op compress when format feature is disabled.
20#[cfg(not(feature = "format"))]
21pub fn compress(data: &[u8]) -> Vec<u8> {
22    data.to_vec()
23}
24
25/// No-op decompress when format feature is disabled.
26#[cfg(not(feature = "format"))]
27pub fn decompress(data: &[u8]) -> WorkflowResult<Vec<u8>> {
28    Ok(data.to_vec())
29}
30
31#[cfg(test)]
32mod tests {
33    use super::*;
34
35    #[test]
36    fn test_compress_decompress_roundtrip() {
37        let original = b"Hello, AgenticWorkflow! This is a test of compression.";
38        let compressed = compress(original);
39        let decompressed = decompress(&compressed).unwrap();
40        assert_eq!(decompressed, original);
41    }
42}