fake.rs

 1use anyhow::Result;
 2use futures::{channel::mpsc, future::BoxFuture, stream::BoxStream, FutureExt, StreamExt};
 3use std::sync::Arc;
 4
 5#[derive(Clone, Default)]
 6pub struct FakeCompletionProvider {
 7    current_completion_tx: Arc<parking_lot::Mutex<Option<mpsc::UnboundedSender<String>>>>,
 8}
 9
10impl FakeCompletionProvider {
11    pub fn complete(&self) -> BoxFuture<'static, Result<BoxStream<'static, Result<String>>>> {
12        let (tx, rx) = mpsc::unbounded();
13        *self.current_completion_tx.lock() = Some(tx);
14        async move { Ok(rx.map(Ok).boxed()) }.boxed()
15    }
16
17    pub fn send_completion(&self, chunk: String) {
18        self.current_completion_tx
19            .lock()
20            .as_ref()
21            .unwrap()
22            .unbounded_send(chunk)
23            .unwrap();
24    }
25
26    pub fn finish_completion(&self) {
27        self.current_completion_tx.lock().take();
28    }
29}