use crate::session::{SessionManager, SimulationManager};
use actix_web::{App, HttpServer};
use std::net::SocketAddr;
use std::sync::Arc;
use tracing::info;
use crate::api::rest::health::PROBE_PATHS;
use crate::api::rest::instance::InstanceHeader;
use crate::api::rest::routes::configure_routes;
use crate::infrastructure::{
ListenOn, MetricsCollector, MetricsMiddleware, MongoDBRepository, Readiness,
};
pub async fn start_server(
session_manager: Arc<SessionManager>,
simulation_manager: Arc<SimulationManager>,
metrics_collector: Arc<MetricsCollector>,
mongodb_repo: Arc<MongoDBRepository>,
listen_on: ListenOn,
port: u16,
readiness: Readiness,
) -> std::io::Result<()> {
let bind_address = SocketAddr::new(listen_on.ip(), port);
info!("Starting server on {}", bind_address);
HttpServer::new(move || {
App::new()
.wrap(InstanceHeader)
.wrap(MetricsMiddleware::new(metrics_collector.clone()).excluding(&PROBE_PATHS))
.configure(|cfg| {
configure_routes(
cfg,
session_manager.clone(),
simulation_manager.clone(),
metrics_collector.clone(),
mongodb_repo.clone(),
readiness.clone(),
)
})
})
.bind(bind_address)?
.run()
.await
}