Skip to main content

agentic_evolve_core/storage/
format.rs

1//! .aevolve binary format (placeholder for future implementation).
2
3use crate::types::error::EvolveResult;
4use crate::types::pattern::Pattern;
5
6/// Magic bytes for .aevolve files.
7pub const MAGIC: &[u8; 4] = b"AEVL";
8
9/// Current format version.
10pub const FORMAT_VERSION: u16 = 1;
11
12/// Write patterns in .aevolve format.
13pub fn write_patterns(patterns: &[&Pattern], output: &mut Vec<u8>) -> EvolveResult<()> {
14    output.extend_from_slice(MAGIC);
15    output.extend_from_slice(&FORMAT_VERSION.to_le_bytes());
16    let count = patterns.len() as u32;
17    output.extend_from_slice(&count.to_le_bytes());
18    for pattern in patterns {
19        let json = serde_json::to_vec(pattern)?;
20        let len = json.len() as u32;
21        output.extend_from_slice(&len.to_le_bytes());
22        output.extend_from_slice(&json);
23    }
24    Ok(())
25}
26
27/// Read patterns from .aevolve format.
28pub fn read_patterns(data: &[u8]) -> EvolveResult<Vec<Pattern>> {
29    use crate::types::error::EvolveError;
30    if data.len() < 8 {
31        return Err(EvolveError::StorageError("File too small".to_string()));
32    }
33    if &data[0..4] != MAGIC {
34        return Err(EvolveError::StorageError("Invalid magic bytes".to_string()));
35    }
36    let _version = u16::from_le_bytes([data[4], data[5]]);
37    let count = u32::from_le_bytes([data[6], data[7], data[8], data[9]]) as usize;
38    let mut patterns = Vec::with_capacity(count);
39    let mut offset = 10;
40    for _ in 0..count {
41        if offset + 4 > data.len() {
42            return Err(EvolveError::StorageError(
43                "Unexpected end of file".to_string(),
44            ));
45        }
46        let len = u32::from_le_bytes([
47            data[offset],
48            data[offset + 1],
49            data[offset + 2],
50            data[offset + 3],
51        ]) as usize;
52        offset += 4;
53        if offset + len > data.len() {
54            return Err(EvolveError::StorageError(
55                "Unexpected end of file".to_string(),
56            ));
57        }
58        let pattern: Pattern = serde_json::from_slice(&data[offset..offset + len])?;
59        patterns.push(pattern);
60        offset += len;
61    }
62    Ok(patterns)
63}