Add pagination.

This commit is contained in:
Tom Alexander 2024-07-25 21:37:14 -04:00
parent 15e1f4dbce
commit 71f9e10600
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE

View File

@ -22,26 +22,38 @@ impl GiteaClient {
owner: O,
repo: R,
commit: C,
) -> Result<(), Box<dyn std::error::Error>> {
let url = format!(
"{api_root}/v1/repos/{owner}/{repo}/git/trees/{commit}?recursive=true&per_page=10",
api_root = self.api_root,
owner = owner.as_ref(),
repo = repo.as_ref(),
commit = commit.as_ref()
);
let response = self
.http_client
.get(url)
.header("Authorization", format!("token {}", self.token))
.send()
.await?;
let response = response.error_for_status()?;
let body = response.text().await?;
debug!("Response: {}", body);
let parsed_body: ResponseGetTree = serde_json::from_str(body.as_str())?;
println!("Response: {:#?}", parsed_body);
Ok(())
) -> Result<Tree, Box<dyn std::error::Error>> {
let mut files = Vec::new();
let mut page: Option<u64> = None;
loop {
let url = format!(
"{api_root}/v1/repos/{owner}/{repo}/git/trees/{commit}?recursive=true&per_page=10{page}",
api_root = self.api_root,
owner = owner.as_ref(),
repo = repo.as_ref(),
commit = commit.as_ref(),
page = page.map(|num| format!("&page={}", num)).unwrap_or_else(|| String::new())
);
let response = self
.http_client
.get(url)
.header("Authorization", format!("token {}", self.token))
.send()
.await?;
let response = response.error_for_status()?;
let body = response.text().await?;
debug!("Response: {}", body);
let parsed_body: ResponseGetTree = serde_json::from_str(body.as_str())?;
println!("Response: {:#?}", parsed_body);
// TODO: Read response objects
if !parsed_body.truncated {
break;
}
// TODO: Switch to using response headers instead of response body.
page = Some(parsed_body.page + 1);
}
Ok(Tree::new(files))
}
}
@ -66,3 +78,23 @@ struct ResponseObjectReference {
sha: String,
url: String,
}
#[derive(Debug)]
pub(crate) struct Tree {
pub(crate) files: Vec<TreeFileReference>,
}
#[derive(Debug)]
pub(crate) struct TreeFileReference {}
impl Tree {
pub(crate) fn new(files: Vec<TreeFileReference>) -> Tree {
Tree { files: Vec::new() }
}
}
impl TreeFileReference {
pub(crate) fn new() -> TreeFileReference {
TreeFileReference {}
}
}