quinjet 0.0.69

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

impl App {
    #[expect(
        clippy::too_many_lines,
        reason = "the exhaustive event match keeps each state transition together"
    )]
    pub(super) fn handle_stack_worker_event(&mut self, event: WorkerEvent) -> Vec<AppEffect> {
        let mut effects = Vec::new();
        match event {
            WorkerEvent::PullRequestStackMember {
                identity,
                generation,
                result,
            } => {
                if self.stack_inspector.selected_identity.as_ref() != Some(&identity)
                    || self.stack_inspector.selected_generation != generation
                {
                    return effects;
                }
                self.stack_inspector.selected_loading = false;
                match result {
                    Ok(snapshot)
                        if snapshot.pull_request.number == identity.number
                            && snapshot
                                .pull_request
                                .base_repository
                                .url
                                .eq_ignore_ascii_case(&identity.repository_url)
                            && snapshot.pull_request.action_state.node_id
                                == identity.pull_request_node_id
                            && self.stack_inspector.selected_locator.as_ref().is_some_and(
                                |locator| {
                                    snapshot.pull_request.base_oid == locator.base_oid
                                        && snapshot.pull_request.head_oid == locator.head_oid
                                },
                            ) =>
                    {
                        self.stack_inspector.selected_pull_request = Some(snapshot.pull_request);
                        self.stack_inspector.selected_from_cache = snapshot.from_cache;
                        self.stack_inspector.selected_error = None;
                    }
                    Ok(_) => {
                        self.stack_inspector.selected_error =
                            Some("GitHub returned a different stack member".to_owned());
                    }
                    Err(error) => self.stack_inspector.selected_error = Some(error),
                }
                self.invalidate_stack_inspector_content_rows();
                if self.stack_inspector.selected_refresh_again {
                    self.stack_inspector.selected_refresh_again = false;
                    self.request_stack_member(true, &mut effects);
                }
            }
            WorkerEvent::PullRequestStackMemberChecks {
                identity,
                generation,
                result,
            } => {
                if self.stack_inspector.selected_identity.as_ref() != Some(&identity)
                    || self.stack_inspector.checks_generation != generation
                {
                    return effects;
                }
                self.stack_inspector.checks_loading = false;
                match result {
                    Ok(checks) => {
                        self.stack_inspector.checks = checks;
                        self.stack_inspector.checks_loaded = true;
                        self.stack_inspector.checks_error = None;
                    }
                    Err(error) => self.stack_inspector.checks_error = Some(error),
                }
                self.invalidate_stack_inspector_content_rows();
                if self.stack_inspector.checks_refresh_again {
                    self.stack_inspector.checks_refresh_again = false;
                    self.request_stack_member_checks(true, &mut effects);
                }
            }
            WorkerEvent::PullRequestStackTipChecks {
                identity,
                generation,
                result,
            } => {
                if self.stack_inspector.tip_identity.as_ref() != Some(&identity)
                    || self.stack_inspector.tip_checks_generation != generation
                {
                    return effects;
                }
                self.stack_inspector.tip_checks_loading = false;
                match result {
                    Ok(checks) => {
                        self.stack_inspector.tip_checks = checks;
                        self.stack_inspector.tip_checks_loaded = true;
                        self.stack_inspector.tip_checks_error = None;
                    }
                    Err(error) => self.stack_inspector.tip_checks_error = Some(error),
                }
                if self.stack_inspector.selected_identity == self.stack_inspector.tip_identity {
                    self.invalidate_stack_inspector_content_rows();
                }
                if self.stack_inspector.tip_checks_refresh_again {
                    self.stack_inspector.tip_checks_refresh_again = false;
                    self.request_stack_tip_checks(true, &mut effects);
                }
            }
            WorkerEvent::PullRequestStackMemberConversation {
                identity,
                generation,
                result,
            } => {
                if self.stack_inspector.selected_identity.as_ref() != Some(&identity)
                    || self.stack_inspector.conversation_generation != generation
                {
                    return effects;
                }
                self.stack_inspector.conversation_loading = false;
                match result {
                    Ok(conversation) => {
                        self.stack_inspector.conversation = conversation;
                        self.stack_inspector.conversation_loaded = true;
                        self.stack_inspector.conversation_error = None;
                    }
                    Err(error) => self.stack_inspector.conversation_error = Some(error),
                }
                self.invalidate_stack_inspector_content_rows();
                if self.stack_inspector.conversation_refresh_again {
                    self.stack_inspector.conversation_refresh_again = false;
                    self.request_stack_member_conversation(true, &mut effects);
                }
            }
            WorkerEvent::PullRequestStackMemberCommits {
                identity,
                generation,
                result,
            } => {
                if self.stack_inspector.selected_identity.as_ref() != Some(&identity)
                    || self.stack_inspector.commits_generation != generation
                {
                    return effects;
                }
                self.stack_inspector.commits_loading = false;
                match result {
                    Ok(commits) => {
                        self.stack_inspector.commits = commits;
                        self.stack_inspector.commits_loaded = true;
                        self.stack_inspector.commits_error = None;
                    }
                    Err(error) => self.stack_inspector.commits_error = Some(error),
                }
                self.invalidate_stack_inspector_content_rows();
            }
            _ => {}
        }
        effects
    }
}