pub mod config;
pub mod graphql;
pub mod handlers;
pub mod helpers;
pub mod routes;
pub mod types;
pub use config::*;
#[cfg(feature = "graphql")]
pub use graphql::create_schema;
pub use routes::create_router;
pub use types::*;
#[cfg(feature = "api-server")]
pub async fn start_server(state: ApiState) -> anyhow::Result<()> {
use axum::http::StatusCode;
use std::net::SocketAddr;
use tower::ServiceBuilder;
use tower_http::{cors::CorsLayer, timeout::TimeoutLayer, trace::TraceLayer};
use tracing::info;
let app = create_router(state.clone()).layer(
ServiceBuilder::new()
.layer(TraceLayer::new_for_http())
.layer(TimeoutLayer::with_status_code(
StatusCode::REQUEST_TIMEOUT,
std::time::Duration::from_secs(state.config.request_timeout_secs),
))
.layer(if state.config.enable_cors {
CorsLayer::permissive()
} else {
CorsLayer::new()
}),
);
let addr = SocketAddr::from(([127, 0, 0, 1], state.config.port));
info!("API server starting on {}", addr);
let listener = tokio::net::TcpListener::bind(addr).await?;
axum::serve(listener, app).await?;
Ok(())
}