grid_builder.rs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. use crate::client_grid::{make_block_meta_delta, make_grid_delta, GridBlockMetaDelta, GridMetaDelta};
  2. use crate::errors::{CollaborateError, CollaborateResult};
  3. use flowy_grid_data_model::entities::{Field, FieldType, GridBlock, GridBlockMeta, GridMeta, RowMeta};
  4. pub struct GridBuilder {
  5. grid_id: String,
  6. fields: Vec<Field>,
  7. grid_block: GridBlock,
  8. grid_block_meta: GridBlockMeta,
  9. }
  10. impl GridBuilder {
  11. pub fn new(grid_id: &str) -> Self {
  12. let grid_block = GridBlock::new();
  13. let grid_block_meta = GridBlockMeta {
  14. block_id: grid_block.id.clone(),
  15. rows: vec![],
  16. };
  17. Self {
  18. grid_id: grid_id.to_owned(),
  19. fields: vec![],
  20. grid_block,
  21. grid_block_meta,
  22. }
  23. }
  24. pub fn add_field(mut self, field: Field) -> Self {
  25. self.fields.push(field);
  26. self
  27. }
  28. pub fn add_empty_row(mut self) -> Self {
  29. let row = RowMeta::new(&self.grid_block.id, vec![]);
  30. self.grid_block_meta.rows.push(row);
  31. self
  32. }
  33. pub fn build(self) -> CollaborateResult<BuildGridInfo> {
  34. let block_id = self.grid_block.id.clone();
  35. let grid_meta = GridMeta {
  36. grid_id: self.grid_id,
  37. fields: self.fields,
  38. blocks: vec![self.grid_block],
  39. };
  40. // let _ = check_rows(&self.fields, &self.rows)?;
  41. let grid_delta = make_grid_delta(&grid_meta);
  42. let grid_block_meta_delta = make_block_meta_delta(&self.grid_block_meta);
  43. Ok(BuildGridInfo {
  44. grid_delta,
  45. block_id,
  46. grid_block_meta_delta,
  47. })
  48. }
  49. }
  50. pub struct BuildGridInfo {
  51. pub grid_delta: GridMetaDelta,
  52. pub block_id: String,
  53. pub grid_block_meta_delta: GridBlockMetaDelta,
  54. }
  55. #[allow(dead_code)]
  56. fn check_rows(fields: &[Field], rows: &[RowMeta]) -> CollaborateResult<()> {
  57. let field_ids = fields.iter().map(|field| &field.id).collect::<Vec<&String>>();
  58. for row in rows {
  59. let cell_field_ids = row.cell_by_field_id.keys().into_iter().collect::<Vec<&String>>();
  60. if cell_field_ids != field_ids {
  61. let msg = format!("{:?} contains invalid cells", row);
  62. return Err(CollaborateError::internal().context(msg));
  63. }
  64. }
  65. Ok(())
  66. }
  67. #[cfg(test)]
  68. mod tests {
  69. use crate::client_grid::GridBuilder;
  70. use flowy_grid_data_model::entities::{Field, FieldType, GridBlockMeta, GridMeta};
  71. #[test]
  72. fn create_default_grid_test() {
  73. let info = GridBuilder::new("1")
  74. .add_field(Field::new("Name", "", FieldType::RichText))
  75. .add_field(Field::new("Tags", "", FieldType::SingleSelect))
  76. .add_empty_row()
  77. .add_empty_row()
  78. .add_empty_row()
  79. .build()
  80. .unwrap();
  81. let grid_meta: GridMeta = serde_json::from_str(&info.grid_delta.to_str().unwrap()).unwrap();
  82. assert_eq!(grid_meta.fields.len(), 2);
  83. assert_eq!(grid_meta.blocks.len(), 1);
  84. let grid_block_meta: GridBlockMeta =
  85. serde_json::from_str(&info.grid_block_meta_delta.to_str().unwrap()).unwrap();
  86. assert_eq!(grid_block_meta.rows.len(), 3);
  87. assert_eq!(grid_meta.blocks[0].id, grid_block_meta.block_id);
  88. }
  89. }