use axum::{ routing::{delete, get, post}, Extension, Router, Server, }; use common::pool::{ create_alpaca_pool_from_env, create_database_pool_from_env, create_rabbitmq_pool_from_env, }; use deadpool::managed::{Hook, HookError, HookErrorCause}; use dotenv::dotenv; use lapin::ExchangeKind; use log::info; use std::{error::Error, net::SocketAddr}; mod routes; #[tokio::main] async fn main() -> Result<(), Box> { dotenv().ok(); log4rs::init_file("log4rs.yaml", Default::default()).unwrap(); let num_clients = 10; let database_pool = create_database_pool_from_env(num_clients).await?; let alpaca_pool = create_alpaca_pool_from_env(num_clients).await?; let rabbitmq_pool = create_rabbitmq_pool_from_env( num_clients, Hook::async_fn(|connection: &mut lapin::Connection, _| { Box::pin(async move { connection .create_channel() .await .map_err(|e| HookError::Abort(HookErrorCause::Backend(e)))? .exchange_declare( "assets", ExchangeKind::Topic, Default::default(), Default::default(), ) .await .map_err(|e| HookError::Abort(HookErrorCause::Backend(e)))?; Ok(()) }) }), ) .await?; let app = Router::new() .route("/assets", get(routes::get_assets)) .route("/assets/:symbol", get(routes::get_asset)) .route("/assets", post(routes::add_asset)) .route("/assets/:symbol", post(routes::update_asset)) .route("/assets/:symbol", delete(routes::delete_asset)) .layer(Extension(database_pool)) .layer(Extension(alpaca_pool)) .layer(Extension(rabbitmq_pool)); let addr = SocketAddr::from(([0, 0, 0, 0], 7878)); info!("Listening on {}...", addr); Server::bind(&addr).serve(app.into_make_service()).await?; Ok(()) }