use octocrab::{Octocrab, Page, Result as OctoResult};
use crate::Repository;
use super::secretalerts::{SecretScanningAlert, SecretScanningSort};
#[derive(Debug, Clone)]
pub struct SecretScanningHandler<'octo> {
crab: &'octo Octocrab,
repository: &'octo Repository,
}
impl<'octo> SecretScanningHandler<'octo> {
pub(crate) fn new(crab: &'octo Octocrab, repository: &'octo Repository) -> Self {
Self { crab, repository }
}
pub fn list(&self) -> ListSecretScanningAlerts {
ListSecretScanningAlerts::new(self)
}
pub async fn get(&self, number: u64) -> OctoResult<SecretScanningAlert> {
let route = format!(
"/repos/{owner}/{repo}/secret-scanning/alerts/{number}",
owner = self.repository.owner(),
repo = self.repository.name(),
number = number
);
self.crab.get(route, None::<&()>).await
}
}
#[derive(Debug, serde::Serialize)]
pub struct ListSecretScanningAlerts<'octo, 'b> {
#[serde(skip)]
handler: &'b SecretScanningHandler<'octo>,
#[serde(skip_serializing_if = "Option::is_none")]
state: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
secret_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
sort: Option<SecretScanningSort>,
#[serde(skip_serializing_if = "Option::is_none")]
validity: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
per_page: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
page: Option<u8>,
}
impl<'octo, 'b> ListSecretScanningAlerts<'octo, 'b> {
pub(crate) fn new(handler: &'b SecretScanningHandler<'octo>) -> Self {
Self {
handler,
state: Some(String::from("open")),
secret_type: None,
sort: None,
validity: None,
per_page: Some(25),
page: Some(1),
}
}
pub fn state(mut self, state: impl Into<String>) -> Self {
let state = state.into();
if !state.is_empty() {
self.state = Some(state);
}
self
}
pub fn secret_type(mut self, stype: impl Into<String>) -> Self {
self.secret_type = Some(stype.into());
self
}
pub fn sort(mut self, sort: impl Into<SecretScanningSort>) -> Self {
self.sort = Some(sort.into());
self
}
pub fn validity(mut self, validity: impl Into<String>) -> Self {
self.validity = Some(validity.into());
self
}
pub fn per_page(mut self, per_page: impl Into<u8>) -> Self {
self.per_page = Some(per_page.into());
self
}
pub fn page(mut self, page: impl Into<u8>) -> Self {
self.page = Some(page.into());
self
}
pub async fn send(self) -> OctoResult<Page<SecretScanningAlert>> {
let route = format!(
"/repos/{owner}/{repo}/secret-scanning/alerts",
owner = self.handler.repository.owner(),
repo = self.handler.repository.name()
);
self.handler.crab.get(route, Some(&self)).await
}
}