use actix_files as fs; use actix_web::{web, App, HttpRequest, HttpResponse, HttpServer, Result}; use askama::Template; /// Represents a repository on disk struct Repository { /// We need to be able to query libgit2 later fs_path: String, /// The project name (last path element) name: String, /// The rope path excluding the name path: Vec, } impl Repository { /// Returns a list of commit hashes for a project fn commits(&self) -> Vec { vec!["f6ca929", "43fb776", "1a0fa2f".into()] .into_iter() .map(String::from) .collect() } /// Return the list of contributors fn contributors(&self) -> Vec { vec![ "Katharina Fey ", ] .into_iter() .map(String::from) .collect() } } #[derive(Template)] #[template(path = "repo.html")] struct Repo<'a> { project_owner: &'a str, project_summary: &'a str, project_name: &'a str, project_logo: &'a str, project_logo_alt_text: &'a str, first_commit: &'a str, num_commits: usize, num_contributors: usize, } fn repo(req: HttpRequest, path: web::Path<(String)>) -> Result { println!("Rendering path: {:#?}", path); dbg!(req); let repo = Repo { project_owner: "spacekookie", project_summary: "A lightweight web frontend for git repositories", project_name: "webgit", project_logo: "rust.png", project_logo_alt_text: "Rust logo", first_commit: "f6ca929", num_commits: 123, num_contributors: 3, } .render() .unwrap(); Ok(HttpResponse::Ok().content_type("text/html").body(repo)) } fn main() -> std::io::Result<()> { // start http server HttpServer::new(move || { App::new() .service(fs::Files::new("/static", "static")) .service(web::resource("/{repo}").route(web::get().to(repo))) }) .bind("127.0.0.1:8080")? .run() }