gitscope
← rgit / 0.1.0 / src/methods/index.rs
https://dev.kronoz.win/r/rgit.git
src/methods/index.rs · Rust
Blame Raw
 1use std::collections::BTreeMap;
 2
 3use anyhow::Context;
 4use askama::Template;
 5use axum::{response::Response, Extension};
 6
 7use super::filters;
 8use crate::{database::schema::repository::Repository, into_response};
 9
10#[derive(Template)]
11#[template(path = "index.html")]
12pub struct View<'a> {
13    pub repositories: BTreeMap<Option<String>, Vec<&'a Repository<'a>>>,
14}
15
16pub async fn handle(Extension(db): Extension<sled::Db>) -> Result<Response, super::repo::Error> {
17    let mut repositories: BTreeMap<Option<String>, Vec<&Repository<'_>>> = BTreeMap::new();
18
19    let fetched = tokio::task::spawn_blocking(move || Repository::fetch_all(&db))
20        .await
21        .context("Failed to join Tokio task")??;
22    for (k, v) in &fetched {
23        // TODO: fixme
24        let mut split: Vec<_> = k.split('/').collect();
25        split.pop();
26        let key = Some(split.join("/")).filter(|v| !v.is_empty());
27
28        let k = repositories.entry(key).or_default();
29        k.push(v.get());
30    }
31
32    Ok(into_response(&View { repositories }))
33}