ctxpack 0.1.0

Configuration-driven source packing for LLM context, with a versioning protocol for incremental patch/replace
pub mod binary;
pub mod encoding;

use anyhow::Result;
use std::path::Path;

use crate::config::{BinaryPolicy, GlobalConfig};

pub fn load_file_content(path: &Path, config: &GlobalConfig) -> Result<Option<String>> {
    let bin = binary::is_binary(path)?;
    if bin {
        match config.binary_policy {
            BinaryPolicy::Skip => return Ok(None),
            BinaryPolicy::Warn => {
                tracing::warn!("binary file skipped: {}", path.display());
                return Ok(None);
            }
            BinaryPolicy::Abort => {
                anyhow::bail!("binary file encountered: {}", path.display());
            }
        }
    }
    let content = encoding::read_to_utf8(path, config.encoding_detection)?;
    Ok(Some(content))
}