use std::str::FromStr;
use strum::{Display, EnumString};
#[derive(Debug, Copy, Clone, PartialEq, Eq, Default, Display, EnumString)]
#[strum(ascii_case_insensitive)]
pub enum LinkStyle {
#[default]
Github,
Gitlab,
Stash,
Cgit,
}
impl<'de> serde::de::Deserialize<'de> for LinkStyle {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::de::Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl LinkStyle {
pub fn issue_link<S: AsRef<str>>(&self, issue: S, repo: Option<S>) -> String {
let issue = issue.as_ref();
if let Some(link) = repo {
let link = link.as_ref();
match *self {
LinkStyle::Github | LinkStyle::Gitlab => format!("{link}/issues/{issue}"),
LinkStyle::Stash | LinkStyle::Cgit => issue.to_string(),
}
} else {
issue.to_string()
}
}
pub fn commit_link<S: AsRef<str>>(&self, hash: S, repo: Option<S>) -> String {
let hash = hash.as_ref();
if let Some(link) = repo {
let link = link.as_ref();
match *self {
LinkStyle::Github | LinkStyle::Gitlab => format!("{link}/commit/{hash}"),
LinkStyle::Stash => format!("{link}/commits/{hash}"),
LinkStyle::Cgit => format!("{link}/commit/?id={hash}"),
}
} else {
(hash[0..8]).to_string()
}
}
}