git-gemini-forge 0.6.6

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

/// See https://docs.gitlab.com/ee/api/projects.html#list-all-projects
struct ProjectsSearchEndpoint<'a> {
	api: &'a GitLabApi,
	base_url: Url,
}

impl ApiEndpoint<GitLabApi, Vec<GitLabProject>> for ProjectsSearchEndpoint<'_> {
	fn api(&self) -> &GitLabApi {
		self.api
	}

	fn url(&self) -> Url {
		let mut url = self.base_url.join("projects").expect("Valid URL path");
		url.set_query(Some("order_by=updated_at&sort=desc&per_page=20")); // Matches /explore/projects
		url
	}
}

/// Retrieves the 12 most recent projects from the given API.
pub async fn get_recent_repos(
	api: &GitLabApi,
	net: &Net,
) -> Result<Vec<GitLabProject>, error::Error> {
	let base_url = api.base_url().clone();
	let endpoint = ProjectsSearchEndpoint { api, base_url };

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