earl 0.5.2

AI-safe CLI for AI agents
use std::fs;
use std::path::Path;

use anyhow::{Context, Result};

use crate::secrets::store::SecretIndex;

pub fn load_index(path: &Path) -> Result<SecretIndex> {
    if !path.exists() {
        return Ok(SecretIndex::default());
    }
    let raw = fs::read_to_string(path)
        .with_context(|| format!("failed reading secrets index {}", path.display()))?;
    let index = serde_json::from_str(&raw)
        .with_context(|| format!("invalid secrets index JSON {}", path.display()))?;
    Ok(index)
}

pub fn save_index(path: &Path, index: &SecretIndex) -> Result<()> {
    if let Some(parent) = path.parent() {
        fs::create_dir_all(parent)
            .with_context(|| format!("failed creating index directory {}", parent.display()))?;
    }
    let json = serde_json::to_string_pretty(index)?;
    fs::write(path, &json)
        .with_context(|| format!("failed writing secrets index {}", path.display()))?;

    #[cfg(unix)]
    {
        use std::os::unix::fs::PermissionsExt;
        fs::set_permissions(path, fs::Permissions::from_mode(0o600))
            .with_context(|| format!("failed setting permissions on {}", path.display()))?;
    }

    Ok(())
}