()
| 27 | |
| 28 | #[tokio::main] |
| 29 | async fn start() -> Result<()> { |
| 30 | // Load environment variables from .env file |
| 31 | dotenvy::dotenv().ok(); |
| 32 | |
| 33 | // Initialize tracing |
| 34 | let rust_log = env::var("RUST_LOG").unwrap_or_else(|_| "info".to_string()); |
| 35 | tracing_subscriber::registry() |
| 36 | .with(EnvFilter::new(rust_log)) |
| 37 | .with(tracing_subscriber::fmt::layer()) |
| 38 | .try_init()?; |
| 39 | |
| 40 | // Load required environment variables |
| 41 | let host = env::var("HOST").expect("HOST is not set in .env file"); |
| 42 | let port = env::var("PORT").expect("PORT is not set in .env file"); |
| 43 | let amp_api_key = env::var("AMP_API_KEY").expect("AMP_API_KEY is not set in .env file"); |
| 44 | AMP_API_KEY.set(amp_api_key).expect("AMP_API_KEY already initialized"); |
| 45 | // Optional Google API key for Google proxy |
| 46 | if let Ok(google_api_key) = env::var("GOOGLE_API_KEY") { |
| 47 | let _ = GOOGLE_API_KEY.set(google_api_key); |
| 48 | } |
| 49 | let server_url = format!("{host}:{port}"); |
| 50 | |
| 51 | // Load proxy configuration |
| 52 | let proxy_config = ProxyConfig::load_from_file("proxy_config.yaml") |
| 53 | .unwrap_or_else(|e| { |
| 54 | info!("Using default proxy configuration ({})", e); |
| 55 | ProxyConfig::default() |
| 56 | }); |
| 57 | |
| 58 | info!("Loaded proxy configuration with {} endpoints", proxy_config.endpoints.len()); |
| 59 | for endpoint in &proxy_config.endpoints { |
| 60 | info!(" - Path: {}, Response Type: {:?}", endpoint.path, endpoint.response_type); |
| 61 | } |
| 62 | |
| 63 | // Create proxy service |
| 64 | let proxy_service = ProxyService::new(proxy_config); |
| 65 | |
| 66 | // Initialize router |
| 67 | let app = Router::new() |
| 68 | .merge(user::router()) |
| 69 | .merge(telemetry::router()) |
| 70 | .merge(proxy_service.create_router()) |
| 71 | .layer(ServiceBuilder::new().layer(TraceLayer::new_for_http())); |
| 72 | |
| 73 | // Start server |
| 74 | let listener = tokio::net::TcpListener::bind(&server_url).await?; |
| 75 | info!("Listening on {}", server_url); |
| 76 | axum::serve(listener, app) |
| 77 | .with_graceful_shutdown(shutdown_signal()) |
| 78 | .await?; |
| 79 | |
| 80 | Ok(()) |
| 81 | } |
| 82 | |
| 83 | async fn shutdown_signal() { |
| 84 | let ctrl_c = async { |
no test coverage detected