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::config;
use crate::network;
use crate::network::*;
use crate::network::responses::*;
use url::Url;
use windmark::response::Response;

/// Answers with Gemtext that consists of a list of recently updated repositories.
pub fn handler(cfg: &config::Config) -> Result<Response, network::error::Error> {
	let platform_url: &Url = &cfg.forge_url;
	let api_url: Url = platform_url.join("api/v1/").unwrap(); // assumes this string works
	println!("Forgejo API URL is {}", api_url.as_str());

	// Get forge metadata
	let version_url: Url = api_url.join("version").unwrap(); // assumes this string works
	let version_obj: Version = get(version_url)?;
	println!("Forgejo {}", version_obj.version);

	// List repos
	let mut repos_url: Url = api_url.join(format!("repos/search").as_str()).unwrap(); // assumes this string works
	repos_url.set_query(Some("sort=updated&order=desc&limit=12"));
	println!("Getting repos from {}...", repos_url.as_str());
	let repos_json: RepoSearch = get(repos_url)?;
	let mut repos = repos_json.data;

	// Sort repos by date
	repos.sort_by(|a: &Repo, b: &Repo| {
		return b.updated_at.cmp(&a.updated_at);
	});

	// Transform repos into Gemtext internal page links
	let repo_links: Vec<String> = repos.iter()
		.map(super::templates::repo_link)
		.collect();

	// Format usernames into a Gemtext list
	let gemtext_list: String = repo_links.iter()
		.map(|n: &String| format!("{n}\n"))
		.collect::<Vec<String>>()
		.concat();

	let gemtext = format!("## Recent Activity\n{gemtext_list}");
	return Ok(Response::success(gemtext));
}