changed_notifier.rs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. use crate::dart_notification::{send_dart_notification, GridDartNotification};
  2. use crate::entities::GridBlockChangesetPB;
  3. use crate::services::filter::FilterResultNotification;
  4. use async_stream::stream;
  5. use futures::stream::StreamExt;
  6. use tokio::sync::broadcast;
  7. #[derive(Clone)]
  8. pub enum GridViewChanged {
  9. DidReceiveFilterResult(FilterResultNotification),
  10. }
  11. pub type GridViewChangedNotifier = broadcast::Sender<GridViewChanged>;
  12. pub(crate) struct GridViewChangedReceiverRunner(pub(crate) Option<broadcast::Receiver<GridViewChanged>>);
  13. impl GridViewChangedReceiverRunner {
  14. pub(crate) async fn run(mut self) {
  15. let mut receiver = self.0.take().expect("Only take once");
  16. let stream = stream! {
  17. loop {
  18. match receiver.recv().await {
  19. Ok(changed) => yield changed,
  20. Err(_e) => break,
  21. }
  22. }
  23. };
  24. stream
  25. .for_each(|changed| async {
  26. match changed {
  27. GridViewChanged::DidReceiveFilterResult(notification) => {
  28. let changeset = GridBlockChangesetPB {
  29. block_id: notification.block_id,
  30. visible_rows: notification.visible_rows,
  31. invisible_rows: notification.invisible_rows,
  32. ..Default::default()
  33. };
  34. send_dart_notification(&changeset.block_id, GridDartNotification::DidUpdateGridBlock)
  35. .payload(changeset)
  36. .send()
  37. }
  38. }
  39. })
  40. .await;
  41. }
  42. }