use anyhow::{Context, Result};
use magellan::OutputFormat;
use sqlitegraph::{SqliteGraph, SqliteGraphBackend};
use std::path::PathBuf;
pub fn run_cypher(db_path: PathBuf, query_str: String, output_format: OutputFormat) -> Result<()> {
use sqlitegraph::cypher::{execute, parse};
let sqlite_graph = SqliteGraph::open(&db_path)
.with_context(|| format!("Failed to open database: {}", db_path.display()))?;
let backend = SqliteGraphBackend::from_graph(sqlite_graph);
let query = parse(&query_str).map_err(|e| anyhow::anyhow!("Parse error: {}", e))?;
let result =
execute(&backend, &query).map_err(|e| anyhow::anyhow!("Execution error: {}", e))?;
match output_format {
OutputFormat::Json => {
println!("{}", serde_json::to_string(&result)?);
}
OutputFormat::Pretty => {
println!("{}", serde_json::to_string_pretty(&result)?);
}
OutputFormat::Human => {
match result {
serde_json::Value::Array(rows) => {
if rows.is_empty() {
println!("0 rows");
} else {
for (i, row) in rows.iter().enumerate() {
println!("row {}: {}", i, serde_json::to_string_pretty(row)?);
}
println!("{}", rows.len());
}
}
other => {
println!("{}", serde_json::to_string_pretty(&other)?);
}
}
}
}
Ok(())
}