2022-03-13 19:36:44 +00:00
|
|
|
use std::fmt::{Debug, Display};
|
|
|
|
use tokio::task::JoinError;
|
2020-12-05 17:19:11 +00:00
|
|
|
use zero2prod::configuration::get_configuration;
|
2022-03-13 19:36:44 +00:00
|
|
|
use zero2prod::issue_delivery_worker::run_worker_until_stopped;
|
2021-02-14 16:41:45 +00:00
|
|
|
use zero2prod::startup::Application;
|
2020-12-05 17:19:11 +00:00
|
|
|
use zero2prod::telemetry::{get_subscriber, init_subscriber};
|
2020-11-01 21:25:11 +00:00
|
|
|
|
2021-12-26 15:53:58 +00:00
|
|
|
#[tokio::main]
|
2022-03-12 19:03:55 +00:00
|
|
|
async fn main() -> anyhow::Result<()> {
|
2021-05-01 14:51:06 +00:00
|
|
|
let subscriber = get_subscriber("zero2prod".into(), "info".into(), std::io::stdout);
|
2020-11-01 21:25:11 +00:00
|
|
|
init_subscriber(subscriber);
|
|
|
|
|
|
|
|
let configuration = get_configuration().expect("Failed to read configuration.");
|
2022-03-13 19:36:44 +00:00
|
|
|
let application = Application::build(configuration.clone()).await?;
|
|
|
|
let application_task = tokio::spawn(application.run_until_stopped());
|
|
|
|
let worker_task = tokio::spawn(run_worker_until_stopped(configuration));
|
|
|
|
|
|
|
|
tokio::select! {
|
|
|
|
o = application_task => report_exit("API", o),
|
|
|
|
o = worker_task => report_exit("Background worker", o),
|
|
|
|
};
|
|
|
|
|
2020-11-01 21:25:11 +00:00
|
|
|
Ok(())
|
|
|
|
}
|
2022-03-13 19:36:44 +00:00
|
|
|
|
|
|
|
fn report_exit(task_name: &str, outcome: Result<Result<(), impl Debug + Display>, JoinError>) {
|
|
|
|
match outcome {
|
|
|
|
Ok(Ok(())) => {
|
|
|
|
tracing::info!("{} has exited", task_name)
|
|
|
|
}
|
|
|
|
Ok(Err(e)) => {
|
|
|
|
tracing::error!(
|
|
|
|
error.cause_chain = ?e,
|
|
|
|
error.message = %e,
|
|
|
|
"{} failed",
|
|
|
|
task_name
|
|
|
|
)
|
|
|
|
}
|
|
|
|
Err(e) => {
|
|
|
|
tracing::error!(
|
|
|
|
error.cause_chain = ?e,
|
|
|
|
error.message = %e,
|
|
|
|
"{}' task failed to complete",
|
|
|
|
task_name
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|