Skip to main content

gitee_rs/files/
mod.rs

1use crate::{error::GiteeError, GiteeClient};
2use reqwest::Method;
3use serde::Deserialize;
4
5mod models;
6pub use models::*;
7
8impl GiteeClient {
9    /// Get file content
10    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    /// List repository files
33    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    /// Search files by content
65    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(&params)
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}