use super::ForgejoApi;
use crate::handlers::templates::PercentEncoded;
use crate::network::ForgeApi;
use crate::network::net::{ApiEndpoint, Net};
use crate::network::{error, responses::Repo};
use url::Url;
struct UserReposEndpoint<'a> {
api: &'a ForgejoApi,
base_url: Url,
username: &'a PercentEncoded,
}
impl ApiEndpoint<ForgejoApi, Vec<Repo>> for UserReposEndpoint<'_> {
fn api(&self) -> &ForgejoApi {
self.api
}
fn url(&self) -> Url {
let mut url = self
.base_url
.join(&format!("users/{}/repos", self.username.uri_component()))
.expect("Valid URL path");
url.set_query(Some("limit=15&page=1")); url
}
}
pub fn get_user_repos(
api: &ForgejoApi,
net: &Net,
username: &PercentEncoded,
) -> Result<Vec<Repo>, error::Error> {
let base_url = api.base_url().clone();
let endpoint = UserReposEndpoint {
api,
base_url,
username,
};
let mut repos = net.call(&endpoint)?;
repos.sort_by(|a: &Repo, b: &Repo| b.updated_at.cmp(&a.updated_at));
Ok(repos)
}