builder.rs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. use crate::entities::folder_info::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::entities::{trash::Trash, workspace::Workspace};
  9. use lib_ot::core::{PlainTextAttributes, PlainTextDelta, PlainTextDeltaBuilder};
  10. use serde::{Deserialize, Serialize};
  11. use std::sync::Arc;
  12. #[derive(Serialize, Deserialize)]
  13. pub(crate) struct FolderPadBuilder {
  14. workspaces: Vec<Arc<Workspace>>,
  15. trash: Vec<Arc<Trash>>,
  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<Workspace>) -> Self {
  25. self.workspaces = workspaces.into_iter().map(Arc::new).collect::<Vec<_>>();
  26. self
  27. }
  28. pub(crate) fn with_trash(mut self, trash: Vec<Trash>) -> 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: PlainTextDelta) -> 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 folder_json = delta.to_str()?;
  38. let mut folder: FolderPad = serde_json::from_str(&folder_json)
  39. .map_err(|e| CollaborateError::internal().context(format!("Deserialize delta to folder failed: {}", e)))?;
  40. folder.delta = delta;
  41. Ok(folder)
  42. }
  43. pub(crate) fn build_with_revisions(self, revisions: Vec<Revision>) -> CollaborateResult<FolderPad> {
  44. let folder_delta: FolderDelta = make_delta_from_revisions::<PlainTextAttributes>(revisions)?;
  45. self.build_with_delta(folder_delta)
  46. }
  47. pub(crate) fn build(self) -> CollaborateResult<FolderPad> {
  48. let json = serde_json::to_string(&self)
  49. .map_err(|e| CollaborateError::internal().context(format!("Serialize to folder json str failed: {}", e)))?;
  50. Ok(FolderPad {
  51. workspaces: self.workspaces,
  52. trash: self.trash,
  53. delta: PlainTextDeltaBuilder::new().insert(&json).build(),
  54. })
  55. }
  56. }