Skip to main content

cai_web/
server.rs

1//! Web server module
2
3use super::{api, AppState, Config};
4use axum::{routing::get, Router};
5use cai_core::Result;
6use cai_storage::Storage;
7use std::net::SocketAddr;
8use tokio::net::TcpListener;
9use tracing::info;
10
11/// Run the web server
12pub async fn run<S>(storage: std::sync::Arc<S>, config: Config) -> Result<()>
13where
14    S: Storage + Send + Sync + 'static,
15{
16    let state = AppState {
17        storage: storage as std::sync::Arc<dyn Storage + Send + Sync>,
18    };
19
20    let app = Router::new()
21        .route("/", get(super::handlers::dashboard_handler))
22        .nest("/api", api::router())
23        .with_state(state);
24
25    let addr = SocketAddr::from(([127, 0, 0, 1], config.port));
26    let listener = TcpListener::bind(addr).await?;
27
28    info!("CAI Web Dashboard listening on http://{}", addr);
29    info!("Open your browser to explore your AI coding history");
30
31    axum::serve(listener, app).await?;
32
33    Ok(())
34}