git-gemini-forge 0.2.0

A simple Gemini server that serves a read-only view of public repositories from a Git forge.
use crate::network::responses::*;
use regex::Regex;

fn username_from_user(user: &User) -> String {
	let whitespace: Regex = Regex::new(r"\s+").unwrap();

	// Replace consecutive whitespace with a single space
	return whitespace.replace_all(&user.login.trim(), " ").to_string();
}

/// Creates an internal page link in Gemtext for the given user page.
pub fn user_link(user: &User) -> String {
	let username: String = username_from_user(&user);

	// Replace space with "_"
	let username_link: String = username
		.replace(' ', "_");

	// Create Gemini link
	return format!("=> /{username_link} {username}");
}

/// Creates an internal page link in Gemtext for the given repo page.
pub fn repo_link(repo: &Repo) -> String {
	let username: String = username_from_user(&repo.owner);

	// Replace space with "_"
	let username_link: String = username
		.replace(' ', "_");

	let repo_link: &String = &repo.name;

	// Create Gemini link
	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");
	}
}