#![deny(clippy::all)] #![deny(clippy::pedantic)] #![deny(clippy::nursery)] #![allow(clippy::module_name_repetitions)] #![allow(clippy::unused_async)] #![allow(clippy::useless_let_if_seq)] // Reason: prevents some OpenApi structs from compiling pub mod route; pub mod settings; pub mod startup; pub mod telemetry; type MaybeListener = Option>; async fn prepare(listener: MaybeListener, test_db: Option) -> startup::Application { dotenvy::dotenv().ok(); let settings = settings::Settings::new().expect("Failed to read settings"); if !cfg!(test) { let subscriber = telemetry::get_subscriber(settings.clone().debug); telemetry::init_subscriber(subscriber); } tracing::event!( target: "gege-jdr-backend", tracing::Level::DEBUG, "Using these settings: {:?}", settings.clone() ); let application = startup::Application::build(settings.clone(), test_db, listener).await; tracing::event!( target: "gege-jdr-backend", tracing::Level::INFO, "Listening on http://127.0.0.1:{}/", application.port() ); application } /// # Errors /// /// May return an error if the server encounters an error it cannot /// recover from. #[cfg(not(tarpaulin_include))] pub async fn run(listener: MaybeListener) -> Result<(), std::io::Error> { let application = prepare(listener, None).await; application.make_app().run().await } #[cfg(test)] async fn make_random_tcp_listener() -> poem::listener::TcpListener { let tcp_listener = std::net::TcpListener::bind("127.0.0.1:0").expect("Failed to bind a random TCP listener"); let port = tcp_listener.local_addr().unwrap().port(); poem::listener::TcpListener::bind(format!("127.0.0.1:{port}")) } #[cfg(test)] async fn get_test_app(test_db: Option) -> startup::App { let tcp_listener = crate::make_random_tcp_listener().await; crate::prepare(Some(tcp_listener), test_db) .await .make_app() .into() }