use std::{path::PathBuf, process, sync::Arc};
use tokio::task::JoinSet;
use crate::{
config::ServerOptions,
router::local::LocalRouter,
server::{self, ServiceContext},
};
enum TaskFinishBehaviour {
Abort(&'static str),
}
pub async fn run_serve(addr: String, port: u16, _id: Option<PathBuf>) {
let server_options = ServerOptions { addr, port };
let router_instance = Arc::new(LocalRouter::new());
let mut tasks_js = JoinSet::new();
let router_cloned = router_instance.clone();
tasks_js.spawn(async move {
router_cloned.run().await;
TaskFinishBehaviour::Abort("Router aborted unexpectedly")
});
tasks_js.spawn(async move {
let ctx = ServiceContext::new(router_instance);
tracing::info!("API server task created.");
server::serve(&server_options, ctx).await;
TaskFinishBehaviour::Abort("API server aborted unexpectedly")
});
while let Ok(finish_behaviour) = tasks_js
.join_next()
.await
.unwrap()
{
match finish_behaviour {
TaskFinishBehaviour::Abort(reason) => {
tracing::error!("Process aborted: {reason}");
process::exit(1);
}
}
}
}