a73x

src/server/http/mod.rs

Ref:   Size: 1.5 KiB

pub mod git_http;
pub mod repo_list;
pub mod repo;

use std::path::PathBuf;
use std::sync::Arc;
use axum::extract::DefaultBodyLimit;
use axum::Router;

#[derive(Debug, Clone)]
pub struct AppState {
    pub repos_dir: PathBuf,
    pub site_title: String,
}

pub fn router(state: AppState) -> Router {
    let shared = Arc::new(state);
    Router::new()
        .route("/", axum::routing::get(repo_list::handler))
        .route("/{repo_name}", axum::routing::get(repo::overview))
        .route("/{repo_name}/commits", axum::routing::get(repo::commits))
        .route("/{repo_name}/commits/{ref_name}", axum::routing::get(repo::commits_ref))
        .route("/{repo_name}/tree", axum::routing::get(repo::tree_root))
        .route("/{repo_name}/tree/{*rest}", axum::routing::get(repo::tree))
        .route("/{repo_name}/blob/{*rest}", axum::routing::get(repo::blob))
        .route("/{repo_name}/diff/{oid}", axum::routing::get(repo::diff))
        .route("/{repo_name}/patches", axum::routing::get(repo::patches))
        .route("/{repo_name}/patches/{id}", axum::routing::get(repo::patch_detail))
        .route("/{repo_name}/issues", axum::routing::get(repo::issues))
        .route("/{repo_name}/issues/{id}", axum::routing::get(repo::issue_detail))
        .route("/{repo_dot_git}/info/refs", axum::routing::get(git_http::info_refs))
        .route("/{repo_dot_git}/git-upload-pack", axum::routing::post(git_http::upload_pack)
            .layer(DefaultBodyLimit::max(git_http::UPLOAD_PACK_BODY_LIMIT)))
        .with_state(shared)
}