| // Copyright 2023 Google LLC |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| use std::task::Poll; |
| |
| use futures::channel::mpsc::UnboundedReceiver; |
| use futures::stream::FusedStream; |
| use futures::{Stream, StreamExt}; |
| |
| use crate::client::error::Error; |
| use crate::client::event::*; |
| |
| pub struct FakeBassEventStream { |
| receiver: UnboundedReceiver<Result<Event, Error>>, |
| terminated: bool, |
| } |
| |
| impl FakeBassEventStream { |
| pub fn new(receiver: UnboundedReceiver<Result<Event, Error>>) -> Self { |
| Self { receiver, terminated: false } |
| } |
| } |
| |
| impl FusedStream for FakeBassEventStream { |
| fn is_terminated(&self) -> bool { |
| self.terminated |
| } |
| } |
| |
| impl Stream for FakeBassEventStream { |
| type Item = Result<Event, Error>; |
| |
| fn poll_next( |
| mut self: std::pin::Pin<&mut Self>, |
| cx: &mut std::task::Context<'_>, |
| ) -> Poll<Option<Self::Item>> { |
| if self.terminated { |
| return Poll::Ready(None); |
| } |
| let polled = self.receiver.poll_next_unpin(cx); |
| if let Poll::Ready(Some(Err(_))) = &polled { |
| self.terminated = true; |
| } |
| polled |
| } |
| } |