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, owner: O,
repo: R, repo: R,
commit: C, commit: C,
) -> Result<(), Box<dyn std::error::Error>> { ) -> Result<Tree, Box<dyn std::error::Error>> {
let url = format!( let mut files = Vec::new();
"{api_root}/v1/repos/{owner}/{repo}/git/trees/{commit}?recursive=true&per_page=10", let mut page: Option<u64> = None;
api_root = self.api_root, loop {
owner = owner.as_ref(), let url = format!(
repo = repo.as_ref(), "{api_root}/v1/repos/{owner}/{repo}/git/trees/{commit}?recursive=true&per_page=10{page}",
commit = commit.as_ref() api_root = self.api_root,
); owner = owner.as_ref(),
let response = self repo = repo.as_ref(),
.http_client commit = commit.as_ref(),
.get(url) page = page.map(|num| format!("&page={}", num)).unwrap_or_else(|| String::new())
.header("Authorization", format!("token {}", self.token)) );
.send() let response = self
.await?; .http_client
let response = response.error_for_status()?; .get(url)
let body = response.text().await?; .header("Authorization", format!("token {}", self.token))
debug!("Response: {}", body); .send()
let parsed_body: ResponseGetTree = serde_json::from_str(body.as_str())?; .await?;
println!("Response: {:#?}", parsed_body); let response = response.error_for_status()?;
Ok(()) 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, 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 {}
}
}