git-gemini-forge 0.5.2

A simple Gemini server that serves a read-only view of public repositories from a Git forge.
use super::converters::GitLabProject;
use super::GitLabApi;
use crate::network::error;
use crate::network::get::{call, ApiEndpoint};
use crate::network::ForgeApi;
use url::Url;

/// See https://docs.gitlab.com/ee/api/projects.html#list-user-projects
struct UserReposEndpoint {
	base_url: Url,
	user_id: String,
}

impl ApiEndpoint<Vec<GitLabProject>> for UserReposEndpoint {
	fn url(&self) -> Url {
		let user_id = &self.user_id;
		return self
			.base_url
			.join(&format!("users/{user_id}/projects"))
			.unwrap();
	}
}

/// Retrieves the user's repositories from the given API.
pub fn get_user_repos(api: &GitLabApi, username: &str) -> Result<Vec<GitLabProject>, error::Error> {
	let base_url = api.base_url().clone();
	let user_id = String::from(username);
	let endpoint = UserReposEndpoint { base_url, user_id };

	// Sort repos by date
	let mut repos = call(&endpoint)?;
	repos.sort_by(|a, b| {
		return b.updated_at.cmp(&a.updated_at);
	});
	return Ok(repos);
}