builder.rs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. use crate::entities::folder::FolderDelta;
  2. use crate::util::make_delta_from_revisions;
  3. use crate::{
  4. client_folder::{default_folder_delta, FolderPad},
  5. entities::revision::Revision,
  6. errors::{CollaborateError, CollaborateResult},
  7. };
  8. use flowy_folder_data_model::revision::{TrashRevision, WorkspaceRevision};
  9. use lib_ot::core::{PhantomAttributes, TextDelta, TextDeltaBuilder};
  10. use serde::{Deserialize, Serialize};
  11. use std::sync::Arc;
  12. #[derive(Serialize, Deserialize)]
  13. pub(crate) struct FolderPadBuilder {
  14. workspaces: Vec<Arc<WorkspaceRevision>>,
  15. trash: Vec<Arc<TrashRevision>>,
  16. }
  17. impl FolderPadBuilder {
  18. pub(crate) fn new() -> Self {
  19. Self {
  20. workspaces: vec![],
  21. trash: vec![],
  22. }
  23. }
  24. pub(crate) fn with_workspace(mut self, workspaces: Vec<WorkspaceRevision>) -> Self {
  25. self.workspaces = workspaces.into_iter().map(Arc::new).collect();
  26. self
  27. }
  28. pub(crate) fn with_trash(mut self, trash: Vec<TrashRevision>) -> Self {
  29. self.trash = trash.into_iter().map(Arc::new).collect::<Vec<_>>();
  30. self
  31. }
  32. pub(crate) fn build_with_delta(self, mut delta: TextDelta) -> CollaborateResult<FolderPad> {
  33. if delta.is_empty() {
  34. delta = default_folder_delta();
  35. }
  36. // TODO: Reconvert from history if delta.to_str() failed.
  37. let content = delta.content_str()?;
  38. let mut folder: FolderPad = serde_json::from_str(&content).map_err(|e| {
  39. tracing::error!("Deserialize folder from {} failed", content);
  40. return CollaborateError::internal().context(format!("Deserialize delta to folder failed: {}", e));
  41. })?;
  42. folder.delta = delta;
  43. Ok(folder)
  44. }
  45. pub(crate) fn build_with_revisions(self, revisions: Vec<Revision>) -> CollaborateResult<FolderPad> {
  46. let folder_delta: FolderDelta = make_delta_from_revisions::<PhantomAttributes>(revisions)?;
  47. self.build_with_delta(folder_delta)
  48. }
  49. pub(crate) fn build(self) -> CollaborateResult<FolderPad> {
  50. let json = serde_json::to_string(&self)
  51. .map_err(|e| CollaborateError::internal().context(format!("Serialize to folder json str failed: {}", e)))?;
  52. Ok(FolderPad {
  53. workspaces: self.workspaces,
  54. trash: self.trash,
  55. delta: TextDeltaBuilder::new().insert(&json).build(),
  56. })
  57. }
  58. }