observable.rs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. use flowy_derive::ProtoBuf_Enum;
  2. use flowy_dispatch::prelude::ToBytes;
  3. use flowy_observable::{dart::RustStreamSender, entities::ObservableSubject};
  4. const OBSERVABLE_CATEGORY: &'static str = "Workspace";
  5. #[derive(ProtoBuf_Enum, Debug)]
  6. pub(crate) enum WorkspaceObservable {
  7. Unknown = 0,
  8. WorkspaceUpdateDesc = 10,
  9. WorkspaceAddApp = 11,
  10. AppUpdateDesc = 20,
  11. AppAddView = 21,
  12. ViewUpdateDesc = 30,
  13. }
  14. impl std::default::Default for WorkspaceObservable {
  15. fn default() -> Self { WorkspaceObservable::Unknown }
  16. }
  17. pub(crate) struct ObservableSender {
  18. ty: WorkspaceObservable,
  19. subject_id: String,
  20. payload: Option<Vec<u8>>,
  21. }
  22. impl ObservableSender {
  23. pub(crate) fn new(subject_id: &str, ty: WorkspaceObservable) -> Self {
  24. Self {
  25. subject_id: subject_id.to_owned(),
  26. ty,
  27. payload: None,
  28. }
  29. }
  30. #[allow(dead_code)]
  31. pub(crate) fn payload<T>(mut self, payload: T) -> Self
  32. where
  33. T: ToBytes,
  34. {
  35. let bytes = payload.into_bytes().unwrap();
  36. self.payload = Some(bytes);
  37. self
  38. }
  39. pub(crate) fn send(self) {
  40. log::debug!(
  41. "Workspace observable id: {}, ty: {:?}",
  42. self.subject_id,
  43. self.ty
  44. );
  45. let subject = ObservableSubject {
  46. category: OBSERVABLE_CATEGORY.to_string(),
  47. ty: self.ty as i32,
  48. subject_id: self.subject_id,
  49. subject_payload: self.payload,
  50. };
  51. match RustStreamSender::post(subject) {
  52. Ok(_) => {},
  53. Err(error) => log::error!("Send observable subject failed: {}", error),
  54. }
  55. }
  56. }
  57. pub(crate) fn send_observable(id: &str, ty: WorkspaceObservable) {
  58. ObservableSender::new(id, ty).send();
  59. }
  60. #[allow(dead_code)]
  61. pub(crate) fn send_observable_with_payload<T>(id: &str, ty: WorkspaceObservable, payload: T)
  62. where
  63. T: ToBytes,
  64. {
  65. ObservableSender::new(id, ty).payload(payload).send();
  66. }