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,13 +22,17 @@ impl GiteaClient {
owner: O, owner: O,
repo: R, repo: R,
commit: C, commit: C,
) -> Result<(), Box<dyn std::error::Error>> { ) -> Result<Tree, Box<dyn std::error::Error>> {
let mut files = Vec::new();
let mut page: Option<u64> = None;
loop {
let url = format!( let url = format!(
"{api_root}/v1/repos/{owner}/{repo}/git/trees/{commit}?recursive=true&per_page=10", "{api_root}/v1/repos/{owner}/{repo}/git/trees/{commit}?recursive=true&per_page=10{page}",
api_root = self.api_root, api_root = self.api_root,
owner = owner.as_ref(), owner = owner.as_ref(),
repo = repo.as_ref(), repo = repo.as_ref(),
commit = commit.as_ref() commit = commit.as_ref(),
page = page.map(|num| format!("&page={}", num)).unwrap_or_else(|| String::new())
); );
let response = self let response = self
.http_client .http_client
@ -41,7 +45,15 @@ impl GiteaClient {
debug!("Response: {}", body); debug!("Response: {}", body);
let parsed_body: ResponseGetTree = serde_json::from_str(body.as_str())?; let parsed_body: ResponseGetTree = serde_json::from_str(body.as_str())?;
println!("Response: {:#?}", parsed_body); println!("Response: {:#?}", parsed_body);
Ok(()) // 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, sha: String,
url: 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 {}
}
}