use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PullRequest {
pub number: u64,
pub title: String,
pub body: Option<String>,
pub state: PullRequestState,
pub draft: bool,
pub head_branch: String,
pub base_branch: String,
pub html_url: String,
pub mergeable: Option<bool>,
pub mergeable_state: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum PullRequestState {
Open,
Closed,
Merged,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CheckRun {
pub name: String,
pub status: CheckStatus,
pub details_url: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum CheckStatus {
Queued,
InProgress,
Success,
Failure,
Skipped,
Cancelled,
}
impl CheckStatus {
#[must_use]
pub const fn is_success(&self) -> bool {
matches!(self, Self::Success | Self::Skipped)
}
#[must_use]
pub const fn is_failure(&self) -> bool {
matches!(self, Self::Failure)
}
#[must_use]
pub const fn is_pending(&self) -> bool {
matches!(self, Self::Queued | Self::InProgress)
}
}
#[derive(Debug, Serialize)]
pub struct CreatePullRequest {
pub title: String,
pub body: String,
pub head: String,
pub base: String,
pub draft: bool,
}
#[derive(Debug, Serialize)]
pub struct UpdatePullRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub body: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub base: Option<String>,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum MergeMethod {
Merge,
#[default]
Squash,
Rebase,
}
#[derive(Debug, Serialize)]
pub struct MergePullRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub commit_title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub commit_message: Option<String>,
pub merge_method: MergeMethod,
}
#[derive(Debug, Clone, Deserialize)]
pub struct MergeResult {
pub sha: String,
pub merged: bool,
pub message: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct IssueComment {
pub id: u64,
pub body: Option<String>,
}
#[derive(Debug, Serialize)]
pub struct CreateComment {
pub body: String,
}
#[derive(Debug, Serialize)]
pub struct UpdateComment {
pub body: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_check_status_is_success() {
assert!(CheckStatus::Success.is_success());
assert!(CheckStatus::Skipped.is_success());
assert!(!CheckStatus::Failure.is_success());
assert!(!CheckStatus::Queued.is_success());
assert!(!CheckStatus::InProgress.is_success());
assert!(!CheckStatus::Cancelled.is_success());
}
#[test]
fn test_check_status_is_failure() {
assert!(CheckStatus::Failure.is_failure());
assert!(!CheckStatus::Success.is_failure());
assert!(!CheckStatus::Skipped.is_failure());
assert!(!CheckStatus::Queued.is_failure());
assert!(!CheckStatus::InProgress.is_failure());
assert!(!CheckStatus::Cancelled.is_failure());
}
#[test]
fn test_check_status_is_pending() {
assert!(CheckStatus::Queued.is_pending());
assert!(CheckStatus::InProgress.is_pending());
assert!(!CheckStatus::Success.is_pending());
assert!(!CheckStatus::Failure.is_pending());
assert!(!CheckStatus::Skipped.is_pending());
assert!(!CheckStatus::Cancelled.is_pending());
}
#[test]
fn test_pull_request_state_equality() {
assert_eq!(PullRequestState::Open, PullRequestState::Open);
assert_eq!(PullRequestState::Closed, PullRequestState::Closed);
assert_eq!(PullRequestState::Merged, PullRequestState::Merged);
assert_ne!(PullRequestState::Open, PullRequestState::Closed);
}
#[test]
fn test_merge_method_default() {
assert_eq!(MergeMethod::default(), MergeMethod::Squash);
}
#[test]
#[allow(clippy::unwrap_used)]
fn test_pull_request_state_serialization() {
assert_eq!(
serde_json::to_string(&PullRequestState::Open).unwrap(),
"\"open\""
);
assert_eq!(
serde_json::to_string(&PullRequestState::Closed).unwrap(),
"\"closed\""
);
assert_eq!(
serde_json::to_string(&PullRequestState::Merged).unwrap(),
"\"merged\""
);
}
#[test]
#[allow(clippy::unwrap_used)]
fn test_check_status_serialization() {
assert_eq!(
serde_json::to_string(&CheckStatus::Queued).unwrap(),
"\"queued\""
);
assert_eq!(
serde_json::to_string(&CheckStatus::InProgress).unwrap(),
"\"inprogress\""
);
assert_eq!(
serde_json::to_string(&CheckStatus::Success).unwrap(),
"\"success\""
);
}
#[test]
#[allow(clippy::unwrap_used)]
fn test_merge_method_serialization() {
assert_eq!(
serde_json::to_string(&MergeMethod::Merge).unwrap(),
"\"merge\""
);
assert_eq!(
serde_json::to_string(&MergeMethod::Squash).unwrap(),
"\"squash\""
);
assert_eq!(
serde_json::to_string(&MergeMethod::Rebase).unwrap(),
"\"rebase\""
);
}
}