document_data.rs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. use std::{collections::HashMap, vec};
  2. use collab_document::blocks::{Block, DocumentData, DocumentMeta};
  3. use nanoid::nanoid;
  4. use crate::entities::{BlockPB, ChildrenPB, DocumentDataPB, MetaPB};
  5. #[derive(Clone, Debug)]
  6. pub struct DocumentDataWrapper(pub DocumentData);
  7. impl From<DocumentDataWrapper> for DocumentDataPB {
  8. fn from(data: DocumentDataWrapper) -> Self {
  9. let blocks = data
  10. .0
  11. .blocks
  12. .into_iter()
  13. .map(|(id, block)| (id, block.into()))
  14. .collect();
  15. let children_map = data
  16. .0
  17. .meta
  18. .children_map
  19. .into_iter()
  20. .map(|(id, children)| (id, children.into()))
  21. .collect();
  22. let page_id = data.0.page_id;
  23. Self {
  24. page_id,
  25. blocks,
  26. meta: MetaPB { children_map },
  27. }
  28. }
  29. }
  30. impl From<DocumentDataPB> for DocumentDataWrapper {
  31. fn from(data: DocumentDataPB) -> Self {
  32. let blocks = data
  33. .blocks
  34. .into_iter()
  35. .map(|(id, block)| (id, block.into()))
  36. .collect();
  37. let children_map = data
  38. .meta
  39. .children_map
  40. .into_iter()
  41. .map(|(id, children)| (id, children.children))
  42. .collect();
  43. let page_id = data.page_id;
  44. Self(DocumentData {
  45. page_id,
  46. blocks,
  47. meta: DocumentMeta { children_map },
  48. })
  49. }
  50. }
  51. // the default document data contains a page block and a text block
  52. impl Default for DocumentDataWrapper {
  53. fn default() -> Self {
  54. let page_type = "page".to_string();
  55. let text_type = "text".to_string();
  56. let mut blocks: HashMap<String, Block> = HashMap::new();
  57. let mut meta: HashMap<String, Vec<String>> = HashMap::new();
  58. // page block
  59. let page_id = nanoid!(10);
  60. let children_id = nanoid!(10);
  61. let root = Block {
  62. id: page_id.clone(),
  63. ty: page_type,
  64. parent: "".to_string(),
  65. children: children_id.clone(),
  66. external_id: None,
  67. external_type: None,
  68. data: HashMap::new(),
  69. };
  70. blocks.insert(page_id.clone(), root);
  71. // text block
  72. let text_block_id = nanoid!(10);
  73. let text_block_children_id = nanoid!(10);
  74. let text_block = Block {
  75. id: text_block_id.clone(),
  76. ty: text_type,
  77. parent: page_id.clone(),
  78. children: text_block_children_id.clone(),
  79. external_id: None,
  80. external_type: None,
  81. data: HashMap::new(),
  82. };
  83. blocks.insert(text_block_id.clone(), text_block);
  84. // meta
  85. meta.insert(children_id, vec![text_block_id]);
  86. meta.insert(text_block_children_id, vec![]);
  87. Self(DocumentData {
  88. page_id,
  89. blocks,
  90. meta: DocumentMeta { children_map: meta },
  91. })
  92. }
  93. }
  94. impl From<Block> for BlockPB {
  95. fn from(block: Block) -> Self {
  96. Self {
  97. id: block.id,
  98. ty: block.ty,
  99. data: serde_json::to_string(&block.data).unwrap_or_default(),
  100. parent_id: block.parent,
  101. children_id: block.children,
  102. }
  103. }
  104. }
  105. impl From<Vec<String>> for ChildrenPB {
  106. fn from(children: Vec<String>) -> Self {
  107. Self { children }
  108. }
  109. }