ctxpack 0.1.0

Configuration-driven source packing for LLM context, with a versioning protocol for incremental patch/replace
use std::fmt::Write as _;

pub struct FileVersion {
    pub fid: u32,
    pub display_path: String,
    pub generation: u32,
    pub pid: u32,
}

pub fn generate_tree(files: &[FileVersion]) -> String {
    let mut out = String::with_capacity(files.len() * 48);
    for f in files {
        if f.pid > 0 {
            let _ =
                writeln!(out, "[{}] {} (gen{}.pid{})", f.fid, f.display_path, f.generation, f.pid);
        } else {
            let _ = writeln!(out, "[{}] {} (gen{})", f.fid, f.display_path, f.generation);
        }
    }
    out
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_tree_gen0() {
        let files = vec![
            FileVersion { fid: 1, display_path: "src/main.rs".to_string(), generation: 0, pid: 0 },
            FileVersion { fid: 2, display_path: "src/lib.rs".to_string(), generation: 0, pid: 0 },
        ];
        let tree = generate_tree(&files);
        assert_eq!(tree, "[1] src/main.rs (gen0)\n[2] src/lib.rs (gen0)\n");
    }

    #[test]
    fn test_tree_with_patches() {
        let files = vec![FileVersion {
            fid: 1,
            display_path: "src/main.rs".to_string(),
            generation: 1,
            pid: 2,
        }];
        let tree = generate_tree(&files);
        assert_eq!(tree, "[1] src/main.rs (gen1.pid2)\n");
    }
}