use std::future::Future; use std::path::PathBuf; use std::pin::Pin; use std::sync::Arc; use warp_core::sync_queue::SyncQueueTaskTrait; use super::diff_state::{DiffMode, DiffStateError, FileDiffAndContent, LocalDiffStateModel}; pub(crate) struct FileInvalidationTask { pub(crate) file: PathBuf, pub(crate) repo_path: PathBuf, pub(crate) mode: DiffMode, pub(crate) merge_base: Option, } impl SyncQueueTaskTrait for FileInvalidationTask { type Error = DiffStateError; /// The first element is the repo-relative path of the updated file. type Result = (String, Option>); #[cfg(not(target_arch = "wasm32"))] type Fut = Pin> + Send>>; #[cfg(target_arch = "wasm32")] type Fut = Pin>>>; fn run(&mut self) -> Self::Fut { let repo_path = self.repo_path.clone(); let file = self.file.clone(); let mode = self.mode.clone(); let merge_base = self.merge_base.clone(); Box::pin(async move { // File invalidation runs local git commands against a local repo path, // so using LocalDiffStateModel directly is correct — remote repos use a // separate mechanism and never go through this queue. LocalDiffStateModel::retrieve_diff_state( &repo_path, &file, &mode, merge_base.as_deref(), ) .await .map_err(DiffStateError::from) }) } }