use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
pub enum Section {
#[default]
PullRequests,
WorkItems,
Pipelines,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ProviderType {
Demo,
GitHub,
AzureDevOps,
Linear,
GitLab,
Bitbucket,
Jira,
}
impl ProviderType {
pub fn as_str(&self) -> &'static str {
match self {
ProviderType::Demo => "Demo",
ProviderType::GitHub => "GitHub",
ProviderType::AzureDevOps => "AzureDevOps",
ProviderType::Linear => "Linear",
ProviderType::GitLab => "GitLab",
ProviderType::Bitbucket => "Bitbucket",
ProviderType::Jira => "Jira",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum PullRequestStatus {
Open,
Draft,
Merged,
Closed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum ReviewVote {
Rejected,
WaitingForAuthor,
NoVote,
ApprovedWithSuggestions,
Approved,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum WorkItemStateCategory {
Triage,
Backlog,
Unstarted,
Started,
Completed,
Canceled,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum PipelineRunStatus {
Queued,
Running,
Succeeded,
PartiallySucceeded,
Failed,
Canceled,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
pub enum CheckStatus {
#[default]
None,
Pending,
Passed,
Failed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
pub enum MergeableState {
#[default]
Unknown,
Mergeable,
Blocked,
Conflicting,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum FileChangeKind {
Added,
Modified,
Deleted,
Renamed,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct User {
pub id: String,
pub display_name: String,
pub handle: Option<String>,
pub avatar_url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Repository {
pub id: String,
pub name: String,
pub full_name: Option<String>,
pub default_branch: Option<String>,
pub url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Comment {
pub id: String,
pub author: User,
pub body: String,
pub created_at: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CommentThread {
pub id: String,
pub comments: Vec<Comment>,
pub file_path: Option<String>,
pub line: Option<i64>,
pub is_resolved: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum TimelineEventKind {
Approved,
ChangesRequested,
Reviewed,
Commented,
Merged,
Closed,
Reopened,
StateChanged,
Assigned,
Labeled,
Committed,
Other,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TimelineEvent {
pub actor: Option<User>,
pub kind: TimelineEventKind,
pub summary: String,
pub at: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Reviewer {
pub user: User,
pub vote: ReviewVote,
pub is_required: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct CheckSummary {
pub successful: u32,
pub in_progress: u32,
pub failed: u32,
pub neutral: u32,
}
impl CheckSummary {
pub fn total(&self) -> u32 {
self.successful + self.in_progress + self.failed + self.neutral
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CheckRun {
pub name: String,
pub status: CheckStatus,
pub url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Commit {
pub sha: String,
pub message: String,
pub author: String,
pub date: Option<DateTime<Utc>>,
pub url: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum DiffSide {
Old,
New,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LineComment {
pub path: String,
pub line: i64,
pub side: DiffSide,
pub body: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileChange {
pub path: String,
pub kind: FileChangeKind,
pub additions: i64,
pub deletions: i64,
pub patch: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PullRequest {
pub id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub repository: Option<String>,
pub number: Option<i64>,
pub title: String,
pub description: Option<String>,
pub author: User,
pub status: PullRequestStatus,
pub is_draft: bool,
pub source_ref: Option<String>,
pub target_ref: Option<String>,
pub reviewers: Vec<Reviewer>,
pub labels: Vec<String>,
pub checks: CheckStatus,
pub check_summary: Option<CheckSummary>,
pub mergeable: MergeableState,
pub changed_files: i64,
pub additions: i64,
pub deletions: i64,
pub created_at: Option<DateTime<Utc>>,
pub updated_at: Option<DateTime<Utc>>,
pub url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WorkItem {
pub id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub repository: Option<String>,
pub identifier: Option<String>,
pub title: String,
pub description: Option<String>,
pub state: String,
pub state_category: WorkItemStateCategory,
pub work_item_type: Option<String>,
pub assignee: Option<User>,
pub created_at: Option<DateTime<Utc>>,
pub updated_at: Option<DateTime<Utc>>,
pub url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PipelineDefinition {
pub id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub repository: Option<String>,
pub name: String,
pub path: Option<String>,
pub url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PipelineStep {
pub name: String,
pub status: PipelineRunStatus,
pub started_at: Option<DateTime<Utc>>,
pub finished_at: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PipelineJob {
pub id: String,
pub name: String,
pub status: PipelineRunStatus,
pub started_at: Option<DateTime<Utc>>,
pub finished_at: Option<DateTime<Utc>>,
pub steps: Vec<PipelineStep>,
pub url: Option<String>,
pub problem: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PipelineStage {
pub name: String,
pub status: PipelineRunStatus,
pub jobs: Vec<PipelineJob>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PipelineRun {
pub id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub repository: Option<String>,
pub definition_id: String,
pub number: Option<i64>,
pub name: Option<String>,
pub title: Option<String>,
pub status: PipelineRunStatus,
pub triggered_by: Option<User>,
pub branch: Option<String>,
pub commit_sha: Option<String>,
pub started_at: Option<DateTime<Utc>>,
pub finished_at: Option<DateTime<Utc>>,
pub url: Option<String>,
pub stages: Vec<PipelineStage>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub event: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub attempt: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub pull_request: Option<i64>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
pub enum AnnotationLevel {
Failure,
Warning,
Notice,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct PipelineAnnotation {
pub level: AnnotationLevel,
pub message: String,
pub title: Option<String>,
pub path: Option<String>,
pub line: Option<u32>,
pub job_id: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct PipelineArtifact {
pub id: String,
pub name: String,
pub size_bytes: Option<u64>,
pub expires_at: Option<DateTime<Utc>>,
pub url: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct PipelineApproval {
pub id: String,
pub name: String,
pub can_respond: bool,
}
impl PullRequest {
pub fn item_ref(&self) -> crate::provider::ItemRef {
crate::provider::ItemRef::maybe(self.repository.clone(), self.id.clone())
}
}
impl WorkItem {
pub fn item_ref(&self) -> crate::provider::ItemRef {
crate::provider::ItemRef::maybe(self.repository.clone(), self.id.clone())
}
}
impl PipelineRun {
pub fn item_ref(&self) -> crate::provider::ItemRef {
crate::provider::ItemRef::maybe(self.repository.clone(), self.id.clone())
}
pub fn definition_ref(&self) -> crate::provider::ItemRef {
crate::provider::ItemRef::maybe(self.repository.clone(), self.definition_id.clone())
}
}
impl PipelineDefinition {
pub fn item_ref(&self) -> crate::provider::ItemRef {
crate::provider::ItemRef::maybe(self.repository.clone(), self.id.clone())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum ApprovalDecision {
Approve,
Reject,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum NotificationKind {
ReviewRequested,
Mention,
Assigned,
CiFailed,
Comment,
StateChange,
Other,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum NotificationItemType {
PullRequest,
WorkItem,
Pipeline,
Other,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Notification {
pub id: String,
pub kind: NotificationKind,
pub item_type: NotificationItemType,
pub item_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub repository: Option<String>,
pub title: String,
pub context: String,
pub url: Option<String>,
pub unread: bool,
pub updated_at: Option<DateTime<Utc>>,
}