diff --git a/src/gitea_client/mod.rs b/src/gitea_client/mod.rs index cf85317..41c051e 100644 --- a/src/gitea_client/mod.rs +++ b/src/gitea_client/mod.rs @@ -22,26 +22,38 @@ impl GiteaClient { owner: O, repo: R, commit: C, - ) -> Result<(), Box> { - 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> { + let mut files = Vec::new(); + let mut page: Option = 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, +} + +#[derive(Debug)] +pub(crate) struct TreeFileReference {} + +impl Tree { + pub(crate) fn new(files: Vec) -> Tree { + Tree { files: Vec::new() } + } +} + +impl TreeFileReference { + pub(crate) fn new() -> TreeFileReference { + TreeFileReference {} + } +}