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::GitLabUser;
use super::GitLabApi;
use crate::network::error;
use crate::network::get::{call, ApiEndpoint, Headers};
use crate::network::ForgeApi;
use secrecy::SecretString;
use url::Url;

/// See https://docs.gitlab.com/ee/api/users.html#list-users
struct UsersSearchEndpoint<'a> {
	base_url: Url,
	private_token: &'a Option<SecretString>,
}

impl ApiEndpoint<Vec<GitLabUser>> for UsersSearchEndpoint<'_> {
	fn url(&self) -> Url {
		// Note: Need token to list active users, but no token to do `/users?username=xxx`
		let mut url = self.base_url.join("users").unwrap();
		url.set_query(Some("active=true&per_page=12&page=1"));
		return url;
	}

	fn headers(&self) -> Headers {
		if let Some(private_token) = self.private_token {
			return Headers::from([(String::from("Private-Token"), private_token)]);
		} else {
			return Headers::new();
		}
	}
}

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

	// Sort users alphabetically by username
	let mut users = call(&endpoint)?;
	users.sort_by(|a, b| {
		return a.username.to_lowercase().cmp(&b.username.to_lowercase());
	});
	return Ok(users);
}