observable.rs 2.3 KB

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