caveman/gatherer/src/main.rs

56 lines
1.4 KiB
Rust

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<String>;
#[derive(Clone)]
pub struct RequestFactory {
store: Store,
}
#[axum::async_trait]
impl Muxable for RequestFactory {
type Key = Option<String>;
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::<Vec<_>>();
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;
}