1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
//! The code scanning API.
use crate::{models, params, Octocrab, Result};
mod list;
mod update;
/// Handler for GitHub's code scanning API.
///
/// Created with [`Octocrab::code_scannings`].
pub struct CodeScanningHandler<'octo> {
crab: &'octo Octocrab,
owner: String,
repo: Option<String>,
}
impl<'octo> CodeScanningHandler<'octo> {
pub(crate) fn new(crab: &'octo Octocrab, owner: String, repo: Option<String>) -> Self {
Self { crab, owner, repo }
}
/// Gets an code scanning from the repository.
/// ```no_run
/// # async fn run(octocrab: &octocrab::Octocrab) -> octocrab::Result<()> {
/// let code_scanning = octocrab.code_scannings("owner", "repo").get(3).await?;
/// # Ok(())
/// # }
/// ```
pub async fn get(&mut self, number: u64) -> Result<models::code_scannings::CodeScanningAlert> {
let route = format!(
"/repos/{owner}/{repo}/code-scanning/alerts/{number}",
owner = self.owner,
repo = self.repo.as_mut().expect("Repository must be specified"),
number = number,
);
self.crab.get(route, None::<&()>).await
}
/// List code scannings in the repository.
pub fn list(&self) -> list::ListCodeScanningsBuilder<'_, '_> {
list::ListCodeScanningsBuilder::new(self)
}
/// Update a code scanning alert
/// ```no_run
/// # use octocrab::params;
///
/// # async fn run(octocrab: &octocrab::Octocrab) -> octocrab::Result<()> {
/// use octocrab::models;
///
/// let issue = octocrab.code_scannings("owner", "repo")
/// .update(1234u64)
/// .state(params::AlertState::Dismissed)
/// // Send the request
/// .send()
/// .await?;
/// # Ok(())
/// # }
/// ```
pub fn update(&self, number: u64) -> update::UpdateCodeScanningBuilder<'_, '_> {
update::UpdateCodeScanningBuilder::new(self, number)
}
/// Get a code scanning analysis for a repository.
///
/// See: https://docs.github.com/en/rest/code-scanning/code-scanning#get-a-code-scanning-analysis-for-a-repository
pub async fn get_analysis(&self, analysis_id: u64) -> Result<models::code_scannings::Analysis> {
let repo = self.repo.as_ref().expect("Repository must be specified");
let route = format!(
"/repos/{}/{}/code-scanning/analyses/{}",
self.owner, repo, analysis_id
);
self.crab.get(route, None::<&()>).await
}
/// Delete a code scanning analysis from a repository.
///
/// See: https://docs.github.com/en/rest/code-scanning/code-scanning#delete-a-code-scanning-analysis-from-a-repository
pub async fn delete_analysis(
&self,
analysis_id: u64,
confirm_delete: Option<impl Into<String>>,
) -> Result<models::code_scannings::DeleteAnalysisResponse> {
let repo = self.repo.as_ref().expect("Repository must be specified");
let route = match confirm_delete {
Some(cd) => format!(
"/repos/{}/{}/code-scanning/analyses/{}?confirm_delete={}",
self.owner,
repo,
analysis_id,
cd.into()
),
None => format!(
"/repos/{}/{}/code-scanning/analyses/{}",
self.owner, repo, analysis_id
),
};
self.crab.delete(route, None::<&()>).await
}
/// List CodeQL databases for a repository.
///
/// See: https://docs.github.com/en/rest/code-scanning/code-scanning#list-codeql-databases-for-a-repository
pub async fn list_codeql_databases(
&self,
) -> Result<Vec<models::code_scannings::CodeqlDatabase>> {
let repo = self.repo.as_ref().expect("Repository must be specified");
let route = format!(
"/repos/{}/{}/code-scanning/codeql/databases",
self.owner, repo
);
self.crab.get(route, None::<&()>).await
}
/// Get a CodeQL database for a language in a repository.
///
/// See: https://docs.github.com/en/rest/code-scanning/code-scanning#get-a-codeql-database-for-a-repository
pub async fn get_codeql_database(
&self,
language: impl AsRef<str>,
) -> Result<models::code_scannings::CodeqlDatabase> {
let repo = self.repo.as_ref().expect("Repository must be specified");
let route = format!(
"/repos/{}/{}/code-scanning/codeql/databases/{}",
self.owner,
repo,
language.as_ref()
);
self.crab.get(route, None::<&()>).await
}
/// Delete a CodeQL database for a language in a repository.
///
/// See: https://docs.github.com/en/rest/code-scanning/code-scanning#delete-a-codeql-database
pub async fn delete_codeql_database(&self, language: impl AsRef<str>) -> Result<()> {
let repo = self.repo.as_ref().expect("Repository must be specified");
let route = format!(
"/repos/{}/{}/code-scanning/codeql/databases/{}",
self.owner,
repo,
language.as_ref()
);
crate::map_github_error(self.crab._delete(route, None::<&()>).await?)
.await
.map(drop)
}
/// Get a code scanning default setup configuration for a repository.
///
/// See: https://docs.github.com/en/rest/code-scanning/code-scanning#get-a-code-scanning-default-setup-configuration
pub async fn get_default_setup(&self) -> Result<models::code_scannings::DefaultSetup> {
let repo = self.repo.as_ref().expect("Repository must be specified");
let route = format!("/repos/{}/{}/code-scanning/default-setup", self.owner, repo);
self.crab.get(route, None::<&()>).await
}
/// Update a code scanning default setup configuration for a repository.
///
/// See: https://docs.github.com/en/rest/code-scanning/code-scanning#update-a-code-scanning-default-setup-configuration
pub async fn update_default_setup(
&self,
body: &models::code_scannings::UpdateDefaultSetup,
) -> Result<models::code_scannings::UpdateDefaultSetupResponse> {
let repo = self.repo.as_ref().expect("Repository must be specified");
let route = format!("/repos/{}/{}/code-scanning/default-setup", self.owner, repo);
self.crab.patch(route, Some(body)).await
}
/// Upload an analysis as SARIF data.
///
/// See: https://docs.github.com/en/rest/code-scanning/code-scanning#upload-an-analysis-as-sarif-data
pub async fn upload_sarif(
&self,
body: &models::code_scannings::UploadSarif,
) -> Result<models::code_scannings::SarifReceipt> {
let repo = self.repo.as_ref().expect("Repository must be specified");
let route = format!("/repos/{}/{}/code-scanning/sarifs", self.owner, repo);
self.crab.post(route, Some(body)).await
}
/// Get information about a SARIF upload.
///
/// See: https://docs.github.com/en/rest/code-scanning/code-scanning#get-information-about-a-sarif-upload
pub async fn get_sarif(
&self,
sarif_id: impl AsRef<str>,
) -> Result<models::code_scannings::SarifAnalysis> {
let repo = self.repo.as_ref().expect("Repository must be specified");
let route = format!(
"/repos/{}/{}/code-scanning/sarifs/{}",
self.owner,
repo,
sarif_id.as_ref()
);
self.crab.get(route, None::<&()>).await
}
}