use maud::{html, Markup}; use time::OffsetDateTime; use crate::server::util; use super::{ base::Base, paths::{PathCommitByHash, PathRunById, PathWorkerByName}, server_config_ext::{AbsPath, ServerConfigExt}, }; pub struct LinkCommit { link: AbsPath, short: String, reachable: i64, } impl LinkCommit { pub fn new(base: &Base, hash: String, message: &str, reachable: i64) -> Self { Self { short: util::format_commit_short(&hash, message), link: base.config.path(PathCommitByHash { hash }), reachable, } } pub fn class_and_title(&self) -> (&'static str, &'static str) { if self.reachable == 0 { ( "commit-orphaned", "This commit is orphaned. It can't be reached from any ref.", ) } else if self.reachable == -1 { ( "commit-reachable", "This commit can only be reached from untracked refs.", ) } else { ( "commit-tracked", "This commit can be reached from a tracked ref.", ) } } pub fn html(&self) -> Markup { let (class, title) = self.class_and_title(); let short = util::truncate(&self.short, 80); html! { a href=(self.link) .(class) title=(title) { (short) } } } } pub struct LinkRunShort { link: AbsPath, short: String, } impl LinkRunShort { pub fn new(base: &Base, id: String, hash: &str, message: &str) -> Self { Self { link: base.config.path(PathRunById { id }), short: util::format_commit_short(hash, message), } } pub fn html(&self) -> Markup { html! { a href=(self.link) { "Run of " (util::truncate(&self.short, 80)) } } } } pub struct LinkRunDate { link: AbsPath, date: String, // TODO base.date(...)? } impl LinkRunDate { pub fn new(base: &Base, id: String, start: OffsetDateTime) -> Self { Self { link: base.config.path(PathRunById { id }), date: util::format_time(start), } } pub fn html(&self) -> Markup { html! { a href=(self.link) { "Run from " (self.date) } } } } pub struct LinkWorker { link: AbsPath, name: String, } impl LinkWorker { pub fn new(base: &Base, name: String) -> Self { Self { link: base.config.path(PathWorkerByName { name: name.clone() }), name, } } pub fn html(&self) -> Markup { html! { a href=(self.link) { (self.name) } } } }