git-gemini-forge 0.6.1

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

struct UsersSearchEndpoint<'a> {
	api: &'a ForgejoApi,
	base_url: Url,
}

impl ApiEndpoint<ForgejoApi, UsersSearch> for UsersSearchEndpoint<'_> {
	fn api(&self) -> &ForgejoApi {
		self.api
	}

	fn url(&self) -> Url {
		let mut url = self.base_url.join("users/search").expect("Valid URL path");
		url.set_query(Some("limit=20&page=1")); // Matches /explore/users
		url
	}
}

/// Retrieves the users from the given API.
pub fn get_users(api: &ForgejoApi, net: &Net) -> Result<Vec<User>, error::Error> {
	let base_url = api.base_url().clone();
	let endpoint = UsersSearchEndpoint { api, base_url };

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