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 users.
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 users
	let users_url: Url = api_url.join("users/search").unwrap(); // assumes this string works
	println!("Getting users from {}...", users_url.as_str());
	let users_json: UsersSearch = get(users_url)?;

	// Sort users alphabetically by username
	let mut users: Vec<User> = users_json.data;
	users.sort_by(|a: &User, b: &User| {
		return a.login.to_lowercase().cmp(&b.login.to_lowercase());
	});

	// Transform users into Gemtext internal page links
	let user_names: Vec<String> = users.iter()
		.map(super::templates::user_link)
		.collect();

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

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