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}