use serde::{Deserialize, Serialize};
pub const OPEN_PRS: usize = 30;
fn is_zero(n: &u64) -> bool {
*n == 0
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RepoRef {
pub namespace: String,
pub name: String,
}
impl RepoRef {
pub fn full(&self) -> String {
format!("{}/{}", self.namespace, self.name)
}
pub fn two(segments: &[String]) -> Option<Self> {
match segments {
[owner, name] => Some(Self {
namespace: owner.clone(),
name: name.clone(),
}),
_ => None,
}
}
pub fn nested(segments: &[String]) -> Option<Self> {
match segments {
[groups @ .., name] if !groups.is_empty() => Some(Self {
namespace: groups.join("/"),
name: name.clone(),
}),
_ => None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum MergeStrategy {
Merge,
Squash,
Rebase,
SemiLinear,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase", default)]
pub struct MergeOptions {
pub strategies: Vec<MergeStrategy>,
pub auto_merge: bool,
}
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
pub struct PullRequestDraft {
pub title: String,
pub body: String,
pub head: String,
pub base: String,
pub draft: bool,
pub reviewers: Vec<String>,
pub labels: Vec<String>,
pub closes: Option<u64>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub enum PrState {
#[default]
Open,
Closed,
Merged,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase", default)]
pub struct PullRequest {
pub number: u64,
pub url: String,
pub title: String,
pub state: PrState,
pub draft: bool,
pub head: String,
pub base: String,
pub mergeable: Option<bool>,
pub approvals: u32,
pub changes_requested: bool,
pub open_threads: u32,
pub auto_merge: bool,
#[serde(skip_serializing_if = "String::is_empty")]
pub author: String,
#[serde(skip_serializing_if = "is_zero")]
pub created: u64,
pub checks: Option<CheckState>,
pub fork: bool,
#[serde(skip_serializing_if = "String::is_empty")]
pub repo: String,
#[serde(skip_serializing_if = "String::is_empty")]
pub head_repo: String,
#[serde(skip_serializing_if = "String::is_empty")]
pub host_repo: String,
#[serde(skip_serializing_if = "String::is_empty")]
pub merge_commit: String,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub reviewers: Vec<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub enum CheckState {
#[default]
Pending,
Success,
Failure,
Skipped,
}
#[derive(Debug, Clone, PartialEq, Serialize, Default, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Check {
pub name: String,
pub state: CheckState,
pub url: Option<String>,
pub job: Option<String>,
pub started: Option<u64>,
pub finished: Option<u64>,
pub cancelled: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum ReviewState {
Approved,
ChangesRequested,
Commented,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ReviewLine {
pub path: String,
pub line: u32,
pub body: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ReviewDraft {
pub state: ReviewState,
pub body: String,
pub lines: Vec<ReviewLine>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RateLimit {
pub limit: u32,
pub remaining: u32,
pub reset: u64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Review {
pub author: String,
pub state: ReviewState,
pub body: String,
#[serde(default, skip_serializing_if = "is_zero")]
pub created: u64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ReviewComment {
pub id: String,
pub author: String,
pub body: String,
pub path: Option<String>,
pub line: Option<u32>,
pub resolved: bool,
#[serde(default, skip_serializing_if = "is_zero")]
pub created: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub excerpt: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase", default)]
pub struct Deployment {
pub environment: String,
pub state: String,
pub url: Option<String>,
#[serde(skip_serializing_if = "String::is_empty")]
pub sha: String,
#[serde(skip_serializing_if = "is_zero")]
pub created: u64,
#[serde(skip_serializing_if = "String::is_empty")]
pub author: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub log: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
pub struct Identity {
pub user: String,
pub label: String,
pub scopes: Option<Vec<String>>,
}