agentic_evolve_core/storage/
format.rs1use crate::types::error::EvolveResult;
4use crate::types::pattern::Pattern;
5
6pub const MAGIC: &[u8; 4] = b"AEVL";
8
9pub const FORMAT_VERSION: u16 = 1;
11
12pub 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
27pub 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}