56 lines
1.4 KiB
Rust
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;
|
|
}
|