grapha 0.1.0

Blazingly fast code intelligence CLI and MCP server for Swift and Rust
Documentation
use std::path::PathBuf;

use grapha_core::graph::Graph;

use super::Store;

pub struct JsonStore {
    path: PathBuf,
}

impl JsonStore {
    pub fn new(path: PathBuf) -> Self {
        Self { path }
    }
}

impl Store for JsonStore {
    fn save(&self, graph: &Graph) -> anyhow::Result<()> {
        let json = serde_json::to_string_pretty(graph)?;
        if let Some(parent) = self.path.parent() {
            std::fs::create_dir_all(parent)?;
        }
        std::fs::write(&self.path, json)?;
        Ok(())
    }

    fn load(&self) -> anyhow::Result<Graph> {
        let content = std::fs::read_to_string(&self.path)?;
        let graph = serde_json::from_str(&content)?;
        Ok(graph)
    }
}

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

    #[test]
    fn json_store_round_trips() {
        let dir = tempfile::tempdir().unwrap();
        let path = dir.path().join("graph.json");
        let store = JsonStore::new(path);

        let graph = Graph::new();
        store.save(&graph).unwrap();
        assert!(store.path.exists());

        let loaded = store.load().unwrap();
        assert_eq!(loaded.version, graph.version);
    }
}