quinjet 0.0.71

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

pub(super) fn load_stack_member(
    session: &mut Session,
    identity: PullRequestStackMemberIdentity,
    generation: u64,
    pull_request: &PullRequest,
    refresh: bool,
) -> WorkerEvent {
    let repository = pull_request.base_repository.clone();
    WorkerEvent::PullRequestStackMember {
        identity,
        generation,
        result: answer(
            session
                .execute(Command::PullRequestLookup {
                    repositories: vec![repository.clone()],
                    repository: Some(Box::new(repository)),
                    number: pull_request.number,
                    refresh,
                })
                .and_then(Outcome::pull_request),
        ),
    }
}

pub(super) fn load_stack_member_checks(
    session: &mut Session,
    identity: PullRequestStackMemberIdentity,
    generation: u64,
    pull_request: Box<PullRequest>,
    refresh: bool,
) -> WorkerEvent {
    WorkerEvent::PullRequestStackMemberChecks {
        identity,
        generation,
        result: load_checks(session, pull_request, refresh),
    }
}

pub(super) fn load_stack_tip_checks(
    session: &mut Session,
    identity: PullRequestStackMemberIdentity,
    generation: u64,
    pull_request: Box<PullRequest>,
    refresh: bool,
) -> WorkerEvent {
    WorkerEvent::PullRequestStackTipChecks {
        identity,
        generation,
        result: load_checks(session, pull_request, refresh),
    }
}

pub(super) fn load_stack_member_conversation(
    session: &mut Session,
    identity: PullRequestStackMemberIdentity,
    generation: u64,
    pull_request: Box<PullRequest>,
) -> WorkerEvent {
    WorkerEvent::PullRequestStackMemberConversation {
        identity,
        generation,
        result: answer(
            session
                .execute(Command::PullRequestConversation { pull_request })
                .and_then(Outcome::conversation),
        ),
    }
}

pub(super) fn load_stack_member_commits(
    session: &mut Session,
    identity: PullRequestStackMemberIdentity,
    generation: u64,
    pull_request: Box<PullRequest>,
) -> WorkerEvent {
    WorkerEvent::PullRequestStackMemberCommits {
        identity,
        generation,
        result: answer(
            session
                .execute(Command::PullRequestCommits { pull_request })
                .and_then(Outcome::commits),
        ),
    }
}

fn load_checks(
    session: &mut Session,
    pull_request: Box<PullRequest>,
    refresh: bool,
) -> Result<PullRequestChecks, String> {
    answer(
        session
            .execute(Command::PullRequestChecks {
                pull_request,
                refresh,
            })
            .and_then(Outcome::checks),
    )
}

pub(super) fn run_stack_warm_worker(
    repository: &Repository,
    mailbox: &Arc<SharedMailbox>,
    generation: &Arc<AtomicU64>,
) {
    let mut session = Session::new(repository.clone_for_worker());
    while let Some(command) = next_command(mailbox) {
        match command {
            WorkerCommand::PrefetchPullRequestStackMembers {
                generation: mine,
                pull_requests,
            } => {
                drop(session.execute_with(
                    Command::WarmPullRequestStackMembers { pull_requests },
                    &mut |_| {},
                    &|| generation.load(Ordering::SeqCst) == mine,
                ));
            }
            WorkerCommand::Shutdown => break,
            _ => {}
        }
    }
}