use super::converters::{GitLabProjectItem, GitLabProjectItemWithUrl};
use super::get_repo::ProjectEndpoint;
use super::GitLabApi;
use crate::handlers::templates::PercentEncoded;
use crate::network::error;
use crate::network::net::{ApiEndpoint, Net};
use crate::network::ForgeApi;
use url::Url;
struct TreeEndpoint<'a> {
api: &'a GitLabApi,
base_url: Url,
project_id: &'a PercentEncoded,
}
impl ApiEndpoint<GitLabApi, Vec<GitLabProjectItem>> for TreeEndpoint<'_> {
fn api(&self) -> &GitLabApi {
self.api
}
fn url(&self) -> Url {
let project_id = &self.project_id;
self.base_url
.join(&format!(
"projects/{}/repository/tree",
project_id.uri_component()
))
.expect("Valid URL path")
}
}
pub fn get_file_tree(
api: &GitLabApi,
net: &Net,
project_id: &PercentEncoded,
) -> Result<Vec<GitLabProjectItemWithUrl>, error::Error> {
let base_url = api.base_url().clone();
let tree = TreeEndpoint {
api,
base_url: base_url.clone(),
project_id,
};
let repo = ProjectEndpoint {
api,
base_url,
project_id,
};
let html_url = {
let project = net.call(&repo)?;
project.web_url
};
let mut contents = net.call(&tree)?;
contents.sort();
return Ok(contents
.iter()
.cloned()
.map(|i| i.with_html_url(html_url.clone()))
.collect());
}