1use std::sync::Arc;
2
3use askama::Template;
4use axum::{Extension, extract::Query, response::IntoResponse};
5use serde::Deserialize;
6
7use crate::{
8 Git,
9 git::ReadmeFormat,
10 into_response,
11 methods::{
12 filters,
13 repo::{Repository, RepositoryPath, Result},
14 },
15};
16
17#[derive(Deserialize)]
18pub struct UriQuery {
19 #[serde(rename = "h")]
20 pub branch: Option<Arc<str>>,
21}
22
23#[derive(Template)]
24#[template(path = "repo/about.html")]
25pub struct View {
26 repo: Repository,
27 readme: Option<(ReadmeFormat, Arc<str>)>,
28 branch: Option<Arc<str>>,
29}
30
31pub async fn handle(
32 Extension(repo): Extension<Repository>,
33 Extension(RepositoryPath(repository_path)): Extension<RepositoryPath>,
34 Extension(git): Extension<Arc<Git>>,
35 Query(query): Query<UriQuery>,
36) -> Result<impl IntoResponse> {
37 let open_repo = git
38 .clone()
39 .repo(repository_path, query.branch.clone())
40 .await?;
41 let readme = open_repo.readme().await?;
42
43 Ok(into_response(View {
44 repo,
45 readme,
46 branch: query.branch,
47 }))
48}