grapha 0.3.0

Blazingly fast code intelligence CLI and MCP server for Swift and Rust
Documentation
pub mod api;

use std::sync::Arc;

use axum::Router;
use axum::response::Html;
use axum::routing::get;

use grapha_core::graph::Graph;
use tantivy::Index;

const INDEX_HTML: &str = include_str!("serve/web/index.html");

pub struct AppState {
    pub graph: Graph,
    pub search_index: Index,
}

pub async fn run(graph: Graph, search_index: Index, port: u16) -> anyhow::Result<()> {
    let state = Arc::new(AppState {
        graph,
        search_index,
    });
    let app = Router::new()
        .route("/", get(|| async { Html(INDEX_HTML) }))
        .route("/api/graph", get(api::get_graph))
        .route("/api/entries", get(api::get_entries))
        .route("/api/context/{symbol}", get(api::get_context))
        .route("/api/trace/{symbol}", get(api::get_trace))
        .route("/api/reverse/{symbol}", get(api::get_reverse))
        .route("/api/search", get(api::get_search))
        .with_state(state)
        .layer(tower_http::cors::CorsLayer::permissive());

    eprintln!("  \x1b[32m✓\x1b[0m serving at http://localhost:{port}");
    let listener = tokio::net::TcpListener::bind(format!("0.0.0.0:{port}")).await?;
    axum::serve(listener, app).await?;
    Ok(())
}