quinjet 0.0.52

A fast, live, keyboard-first Git source-control interface for the terminal
#[cfg_attr(not(test), expect(clippy::wildcard_imports, reason = "shared"))]
use super::*;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum PrMenuItem {
    Merge(PullRequestMergeMethod),
    Stage,
    AutoMerge,
    DisableAutoMerge,
    Dequeue,
    AdminMerge,
    Review,
    Comments,
    Edit,
    UpdateBranch,
    Lock,
    Unlock,
    Subscribe,
    Unsubscribe,
    AllowMaintainerEdits,
    DisallowMaintainerEdits,
    Revert,
    Close,
    OpenInBrowser,
}

impl PrMenuItem {
    pub(crate) const fn label(self) -> &'static str {
        match self {
            Self::Merge(method) => method.label(),
            Self::Stage => "Change review stage…",
            Self::AutoMerge => "Enable auto-merge…",
            Self::DisableAutoMerge => "Disable auto-merge",
            Self::Dequeue => "Remove from merge queue",
            Self::AdminMerge => "Merge as administrator…",
            Self::Review => "Submit review…",
            Self::Comments => "Manage comments…",
            Self::Edit => "Edit metadata…",
            Self::UpdateBranch => "Update branch…",
            Self::Lock => "Lock conversation…",
            Self::Unlock => "Unlock conversation",
            Self::Subscribe => "Subscribe",
            Self::Unsubscribe => "Unsubscribe",
            Self::AllowMaintainerEdits => "Allow maintainer edits",
            Self::DisallowMaintainerEdits => "Disallow maintainer edits",
            Self::Revert => "Create revert pull request…",
            Self::Close => "Close pull request",
            Self::OpenInBrowser => "Open in browser",
        }
    }
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum PrPrimaryAction {
    Merge(PullRequestMergeMethod),
    Ready,
    Dequeue,
    DisableAutoMerge,
    Reopen,
    OpenInBrowser,
}

impl PrPrimaryAction {
    pub(crate) const fn label(self) -> &'static str {
        match self {
            Self::Merge(method) => method.label(),
            Self::Ready => "Ready for review",
            Self::Dequeue => "Remove from merge queue",
            Self::DisableAutoMerge => "Disable auto-merge",
            Self::Reopen => "Reopen pull request",
            Self::OpenInBrowser => "Open in browser",
        }
    }
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum PullRequestEditField {
    Title,
    Body,
    Base,
    AddAssignee,
    RemoveAssignee,
    AddLabel,
    RemoveLabel,
    AddProject,
    RemoveProject,
    AddReviewer,
    RemoveReviewer,
    Milestone,
    RemoveMilestone,
}

impl PullRequestEditField {
    pub(crate) const ALL: [Self; 13] = [
        Self::Title,
        Self::Body,
        Self::Base,
        Self::AddAssignee,
        Self::RemoveAssignee,
        Self::AddLabel,
        Self::RemoveLabel,
        Self::AddProject,
        Self::RemoveProject,
        Self::AddReviewer,
        Self::RemoveReviewer,
        Self::Milestone,
        Self::RemoveMilestone,
    ];

    pub(crate) const fn label(self) -> &'static str {
        match self {
            Self::Title => "Edit title",
            Self::Body => "Edit description",
            Self::Base => "Change base branch",
            Self::AddAssignee => "Add assignees",
            Self::RemoveAssignee => "Remove assignees",
            Self::AddLabel => "Add labels",
            Self::RemoveLabel => "Remove labels",
            Self::AddProject => "Add to projects",
            Self::RemoveProject => "Remove from projects",
            Self::AddReviewer => "Request reviewers",
            Self::RemoveReviewer => "Remove review requests",
            Self::Milestone => "Set milestone",
            Self::RemoveMilestone => "Remove milestone",
        }
    }

    pub(crate) fn edit(self, value: String) -> PullRequestEdit {
        match self {
            Self::Title => PullRequestEdit::Title(value),
            Self::Body => PullRequestEdit::Body(value),
            Self::Base => PullRequestEdit::Base(value),
            Self::AddAssignee => PullRequestEdit::AddAssignee(value),
            Self::RemoveAssignee => PullRequestEdit::RemoveAssignee(value),
            Self::AddLabel => PullRequestEdit::AddLabel(value),
            Self::RemoveLabel => PullRequestEdit::RemoveLabel(value),
            Self::AddProject => PullRequestEdit::AddProject(value),
            Self::RemoveProject => PullRequestEdit::RemoveProject(value),
            Self::AddReviewer => PullRequestEdit::AddReviewer(value),
            Self::RemoveReviewer => PullRequestEdit::RemoveReviewer(value),
            Self::Milestone => PullRequestEdit::SetMilestone(value),
            Self::RemoveMilestone => PullRequestEdit::RemoveMilestone,
        }
    }
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum PrActionItem {
    AutoMerge(PullRequestMergeMethod),
    AdminMerge(PullRequestMergeMethod),
    Review(PullRequestReviewKind),
    Comment(PullRequestCommentMode),
    Edit(PullRequestEditField),
    UpdateBranch(PullRequestUpdateMethod),
    Lock(Option<PullRequestLockReason>),
    Revert(bool),
}

impl PrActionItem {
    pub(crate) const fn label(self) -> &'static str {
        match self {
            Self::AutoMerge(method) | Self::AdminMerge(method) => method.label(),
            Self::Review(kind) => kind.label(),
            Self::Comment(PullRequestCommentMode::Create) => "Add comment",
            Self::Comment(PullRequestCommentMode::EditLast) => "Edit my latest comment",
            Self::Comment(PullRequestCommentMode::DeleteLast) => "Delete my latest comment",
            Self::Edit(field) => field.label(),
            Self::UpdateBranch(PullRequestUpdateMethod::Merge) => "Merge base into head",
            Self::UpdateBranch(PullRequestUpdateMethod::Rebase) => "Rebase head onto base",
            Self::Lock(None) => "Lock without a reason",
            Self::Lock(Some(PullRequestLockReason::OffTopic)) => "Lock as off topic",
            Self::Lock(Some(PullRequestLockReason::Resolved)) => "Lock as resolved",
            Self::Lock(Some(PullRequestLockReason::Spam)) => "Lock as spam",
            Self::Lock(Some(PullRequestLockReason::TooHeated)) => "Lock as too heated",
            Self::Revert(false) => "Create ready revert pull request",
            Self::Revert(true) => "Create draft revert pull request",
        }
    }

    pub(crate) const fn needs_input(self) -> bool {
        matches!(
            self,
            Self::Review(PullRequestReviewKind::Comment | PullRequestReviewKind::RequestChanges)
                | Self::Comment(PullRequestCommentMode::Create | PullRequestCommentMode::EditLast)
                | Self::Edit(
                    PullRequestEditField::Title
                        | PullRequestEditField::Body
                        | PullRequestEditField::Base
                        | PullRequestEditField::AddAssignee
                        | PullRequestEditField::RemoveAssignee
                        | PullRequestEditField::AddLabel
                        | PullRequestEditField::RemoveLabel
                        | PullRequestEditField::AddProject
                        | PullRequestEditField::RemoveProject
                        | PullRequestEditField::AddReviewer
                        | PullRequestEditField::RemoveReviewer
                        | PullRequestEditField::Milestone
                )
        )
    }
}