use cave::{ config::LoadConfig, store::Store, }; use crate::request_mux::{Muxable, RequestMux}; mod config; mod trends; mod html_template; mod http_server; mod request_mux; type Languages = Vec; #[derive(Clone)] pub struct RequestFactory { store: Store, } #[axum::async_trait] impl Muxable for RequestFactory { type Key = Option; type Result = (crate::trends::TrendsResults, Languages); async fn request(&self, language: Self::Key) -> Self::Result { let mut store = self.store.clone(); let results = trends::TrendAnalyzer::run(&mut store, 20, &[4, 24, 24 * 7], language) .await.unwrap(); let mut languages = store.get_languages().await.unwrap(); languages.sort_by(|(_, count1), (_, count2)| count2.cmp(count1)); let mut languages = languages.into_iter() .map(|(l, _)| l) .collect::>(); languages.sort(); (results, languages) } } #[tokio::main] async fn main() { cave::init::exit_on_panic(); cave::init::init_logger(); let config = config::Config::load(); cave::systemd::status("Starting redis client"); let store = cave::store::Store::new(&config.redis).await; let http = http_server::start( config.listen_port, RequestMux::new(RequestFactory { store }), ); cave::systemd::ready(); http.await; }