1use crate::{error::GiteeError, GiteeClient};
2use reqwest::Method;
3use serde::Deserialize;
4
5mod models;
6pub use models::*;
7
8impl GiteeClient {
9 pub async fn get_file_content(&self, owner: &str, repo: &str, file_path: &str, r#ref: Option<&str>) -> Result<FileContent, GiteeError> {
11 let url = format!("{}/repos/{}/{}/contents/{}", self.base_url(), owner, repo, file_path);
12 let mut request = self.client().request(Method::GET, &url)
13 .header("Authorization", self.auth_header());
14
15 if let Some(r) = r#ref {
16 request = request.query(&[("ref", r)]);
17 }
18
19 let response = request.send().await?;
20
21 if !response.status().is_success() {
22 return Err(GiteeError::ApiError(format!(
23 "Failed to get file content: {}",
24 response.status()
25 )));
26 }
27
28 let file_content: FileContent = response.json().await?;
29 Ok(file_content)
30 }
31
32 pub async fn list_repo_files(&self, owner: &str, repo: &str, path: Option<&str>, r#ref: Option<&str>) -> Result<Vec<RepoFile>, GiteeError> {
34 let url = if let Some(p) = path {
35 if p.is_empty() {
36 format!("{}/repos/{}/{}/contents", self.base_url(), owner, repo)
37 } else {
38 format!("{}/repos/{}/{}/contents/{}", self.base_url(), owner, repo, p)
39 }
40 } else {
41 format!("{}/repos/{}/{}/contents", self.base_url(), owner, repo)
42 };
43
44 let mut request = self.client().request(Method::GET, &url)
45 .header("Authorization", self.auth_header());
46
47 if let Some(r) = r#ref {
48 request = request.query(&[("ref", r)]);
49 }
50
51 let response = request.send().await?;
52
53 if !response.status().is_success() {
54 return Err(GiteeError::ApiError(format!(
55 "Failed to list repo files: {}",
56 response.status()
57 )));
58 }
59
60 let repo_files: Vec<RepoFile> = response.json().await?;
61 Ok(repo_files)
62 }
63
64 pub async fn search_files_by_content(&self, query: &str, owner: Option<&str>, repo: Option<&str>, page: Option<i32>, per_page: Option<i32>) -> Result<Vec<RepoFile>, GiteeError> {
66 let url = format!("{}/search/code", self.base_url());
67
68 let mut params = vec![("q", query.to_string())];
69 if let Some(o) = owner { params.push(("owner", o.to_string())); }
70 if let Some(r) = repo { params.push(("repo", r.to_string())); }
71 if let Some(p) = page { params.push(("page", p.to_string())); }
72 if let Some(pp) = per_page { params.push(("per_page", pp.to_string())); }
73
74 let response = self
75 .client()
76 .request(Method::GET, &url)
77 .header("Authorization", self.auth_header())
78 .query(¶ms)
79 .send()
80 .await?;
81
82 if !response.status().is_success() {
83 return Err(GiteeError::ApiError(format!(
84 "Failed to search files by content: {}",
85 response.status()
86 )));
87 }
88
89 #[derive(Deserialize)]
90 struct SearchCodeResult {
91 items: Vec<RepoFile>,
92 }
93
94 let search_result: SearchCodeResult = response.json().await?;
95 Ok(search_result.items)
96 }
97}