1pub mod routes;
6pub mod tls;
7pub mod tracing;
8
9use crate::config::Config;
10use crate::error::ProxyError;
11use crate::middleware;
12use axum::{
13 routing::{get, post},
14 Router,
15};
16use std::net::SocketAddr;
17use tower_http::{compression::CompressionLayer, cors::CorsLayer, trace::TraceLayer};
18
19pub async fn build_app(config: Config) -> Result<Router, ProxyError> {
21 let app = Router::new()
23 .route("/health", get(routes::health_check))
25 .route("/health/ready", get(routes::readiness_check))
26 .route("/health/live", get(routes::liveness_check))
27 .route("/metrics", get(routes::metrics))
29 .route("/v1/chat/completions", post(routes::chat_completions))
31 .route("/v1/completions", post(routes::completions))
32 .layer(axum::middleware::from_fn_with_state(
37 config.clone(),
38 middleware::auth_middleware,
39 ))
40 .layer(TraceLayer::new_for_http())
42 .layer(CompressionLayer::new())
43 .layer(CorsLayer::permissive())
44 .with_state(config);
46
47 Ok(app)
48}
49
50pub fn create_router() -> Router {
52 Router::new()
53 .route("/health", get(routes::health_check))
54 .route("/health/ready", get(routes::readiness_check))
55}
56
57pub async fn serve(addr: SocketAddr, router: Router) -> anyhow::Result<()> {
59 eprintln!("Starting server on {}", addr);
60
61 let listener = tokio::net::TcpListener::bind(addr).await?;
62 axum::serve(listener, router).await?;
63
64 Ok(())
65}