use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use url::Url;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct StackedPrEntry {
pub number: u64,
pub state: String,
pub draft: bool,
pub merged_at: Option<DateTime<Utc>>,
pub head: PrHeadRef,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct PrHeadRef {
#[serde(rename = "ref")]
pub ref_field: String,
pub sha: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct StackBase {
#[serde(rename = "ref")]
pub ref_field: String,
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub sha: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct PrStack {
pub id: u64,
pub number: u64,
pub node_id: String,
pub url: Url,
pub base: StackBase,
pub open: bool,
pub created_at: DateTime<Utc>,
pub pull_requests: Vec<StackedPrEntry>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct PullRequestStackSummary {
#[serde(default)]
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<u64>,
pub number: u64,
pub position: u64,
pub size: u64,
pub base: StackBase,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum AsyncMergeMethod {
Default,
Merge,
Squash,
Rebase,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum AsyncMergeAction {
Default,
DirectMerge,
MergeQueue,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum AsyncMergeStatus {
Pending,
Merged,
Enqueued,
Failed,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
#[non_exhaustive]
pub enum AsyncMergeDetails {
Pending {
message: String,
uuid: String,
merge_method: AsyncMergeMethod,
merge_action: AsyncMergeAction,
expected_head_sha: String,
#[serde(default)]
bypass_rules: bool,
},
Merged { message: String, sha: String },
Failed { message: String },
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct AsyncMergeResult {
pub status: AsyncMergeStatus,
pub details: AsyncMergeDetails,
}