]> git.lizzy.rs Git - rust.git/blob - crates/rust-analyzer/src/op_queue.rs
Move highlight configuration from protocol into the feature
[rust.git] / crates / rust-analyzer / src / op_queue.rs
1 //! Bookkeeping to make sure only one long-running operation is being executed
2 //! at a time.
3
4 pub(crate) type Cause = String;
5
6 pub(crate) struct OpQueue<Output> {
7     op_requested: Option<Cause>,
8     op_in_progress: bool,
9     last_op_result: Output,
10 }
11
12 impl<Output: Default> Default for OpQueue<Output> {
13     fn default() -> Self {
14         Self { op_requested: None, op_in_progress: false, last_op_result: Default::default() }
15     }
16 }
17
18 impl<Output> OpQueue<Output> {
19     pub(crate) fn request_op(&mut self, reason: Cause) {
20         self.op_requested = Some(reason);
21     }
22     pub(crate) fn should_start_op(&mut self) -> Option<Cause> {
23         if self.op_in_progress {
24             return None;
25         }
26         self.op_in_progress = self.op_requested.is_some();
27         self.op_requested.take()
28     }
29     pub(crate) fn op_completed(&mut self, result: Output) {
30         assert!(self.op_in_progress);
31         self.op_in_progress = false;
32         self.last_op_result = result;
33     }
34
35     pub(crate) fn last_op_result(&self) -> &Output {
36         &self.last_op_result
37     }
38     pub(crate) fn op_in_progress(&self) -> bool {
39         self.op_in_progress
40     }
41     pub(crate) fn op_requested(&self) -> bool {
42         self.op_requested.is_some()
43     }
44 }