use crate::network::responses::*;
use regex::Regex;
fn username_from_user(user: &User) -> String {
let whitespace: Regex = Regex::new(r"\s+").unwrap();
return whitespace.replace_all(&user.login.trim(), " ").to_string();
}
pub fn user_link(user: &User) -> String {
let username: String = username_from_user(&user);
let username_link: String = username
.replace(' ', "_");
return format!("=> /{username_link} {username}");
}
pub fn repo_link(repo: &Repo) -> String {
let username: String = username_from_user(&repo.owner);
let username_link: String = username
.replace(' ', "_");
let repo_link: &String = &repo.name;
return format!("=> /{username_link}/{repo_link} {username_link}/{repo_link}");
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_trims_username_whitespace() {
let login: String = String::from("foo ");
let user: User = User { login };
assert_eq!(user_link(&user), "=> /foo foo");
}
#[test]
fn test_trims_username_newline() {
let login: String = String::from("foo\n");
let user: User = User { login };
assert_eq!(user_link(&user), "=> /foo foo");
}
#[test]
fn test_ignores_newline() {
let login: String = String::from("foo\nbar");
let user: User = User { login };
assert_eq!(user_link(&user), "=> /foo_bar foo bar");
}
#[test]
fn test_ignores_multiple_newlines() {
let login: String = String::from("foo\n\nbar");
let user: User = User { login };
assert_eq!(user_link(&user), "=> /foo_bar foo bar");
}
#[test]
fn test_uses_good_username() {
let login: String = String::from("foobar");
let user: User = User { login };
assert_eq!(user_link(&user), "=> /foobar foobar");
}
}