1pub mod config;
16pub mod graphql;
17pub mod handlers;
18pub mod helpers;
19pub mod routes;
20pub mod types;
21
22pub use config::*;
24#[cfg(feature = "graphql")]
25pub use graphql::create_schema;
26pub use routes::create_router;
27pub use types::*;
28
29#[cfg(feature = "api-server")]
31pub async fn start_server(state: ApiState) -> anyhow::Result<()> {
32 use axum::http::StatusCode;
33 use std::net::SocketAddr;
34 use tower::ServiceBuilder;
35 use tower_http::{cors::CorsLayer, timeout::TimeoutLayer, trace::TraceLayer};
36 use tracing::info;
37
38 let app = create_router(state.clone()).layer(
39 ServiceBuilder::new()
40 .layer(TraceLayer::new_for_http())
41 .layer(TimeoutLayer::with_status_code(
42 StatusCode::REQUEST_TIMEOUT,
43 std::time::Duration::from_secs(state.config.request_timeout_secs),
44 ))
45 .layer(if state.config.enable_cors {
46 CorsLayer::permissive()
47 } else {
48 CorsLayer::new()
49 }),
50 );
51
52 let addr = SocketAddr::from(([127, 0, 0, 1], state.config.port));
53 info!("API server starting on {}", addr);
54
55 let listener = tokio::net::TcpListener::bind(addr).await?;
56 axum::serve(listener, app).await?;
57
58 Ok(())
59}