use std::sync::atomic::{AtomicBool, Ordering};
use super::OutputToken;
use super::errors::{ErrorLogger, ErrorPresenter, ErrorToken};
use crate::contexts::prompt::domain::{
branch_sync::BranchSyncRepository, ci_checks::CiChecksRepository,
merge_ready::MergeReadinessRepository, pr_state::PrStateRepository, review::ReviewRepository,
};
pub enum ExecutionMode {
Direct,
Cached,
}
pub fn fetch_output<C, L>(client: &C, logger: &L) -> Option<Vec<OutputToken>>
where
C: PrStateRepository
+ BranchSyncRepository
+ CiChecksRepository
+ ReviewRepository
+ MergeReadinessRepository
+ Sync,
L: ErrorLogger + Sync,
{
struct TrackingPresenter(AtomicBool);
impl ErrorPresenter for TrackingPresenter {
fn show_error(&self, _token: ErrorToken) {
self.0
.update(Ordering::Relaxed, Ordering::Relaxed, |_| true);
}
}
let presenter = TrackingPresenter(AtomicBool::new(false));
let tokens = super::run(client, logger, &presenter);
if presenter.0.load(Ordering::Relaxed) {
None
} else {
Some(tokens)
}
}