grid_builder.rs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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::{BuildGridContext, FieldMeta, GridBlock, GridBlockMeta, GridMeta, RowMeta};
  4. pub struct GridBuilder {
  5. build_context: BuildGridContext,
  6. }
  7. impl std::default::Default for GridBuilder {
  8. fn default() -> Self {
  9. Self {
  10. build_context: Default::default(),
  11. }
  12. }
  13. }
  14. impl GridBuilder {
  15. pub fn add_field(mut self, field: FieldMeta) -> Self {
  16. self.build_context.field_metas.push(field);
  17. self
  18. }
  19. pub fn add_empty_row(mut self) -> Self {
  20. let row = RowMeta::new(&self.build_context.grid_block.id);
  21. self.build_context.grid_block_meta.rows.push(row);
  22. self.build_context.grid_block.row_count += 1;
  23. self
  24. }
  25. pub fn build(self) -> BuildGridContext {
  26. self.build_context
  27. }
  28. }
  29. #[allow(dead_code)]
  30. fn check_rows(fields: &[FieldMeta], rows: &[RowMeta]) -> CollaborateResult<()> {
  31. let field_ids = fields.iter().map(|field| &field.id).collect::<Vec<&String>>();
  32. for row in rows {
  33. let cell_field_ids = row.cell_by_field_id.keys().into_iter().collect::<Vec<&String>>();
  34. if cell_field_ids != field_ids {
  35. let msg = format!("{:?} contains invalid cells", row);
  36. return Err(CollaborateError::internal().context(msg));
  37. }
  38. }
  39. Ok(())
  40. }
  41. #[cfg(test)]
  42. mod tests {
  43. use crate::client_grid::{make_block_meta_delta, make_grid_delta, GridBuilder};
  44. use flowy_grid_data_model::entities::{FieldMeta, FieldType, GridBlockMeta, GridMeta};
  45. #[test]
  46. fn create_default_grid_test() {
  47. let grid_id = "1".to_owned();
  48. let build_context = GridBuilder::default()
  49. .add_field(FieldMeta::new("Name", "", FieldType::RichText))
  50. .add_field(FieldMeta::new("Tags", "", FieldType::SingleSelect))
  51. .add_empty_row()
  52. .add_empty_row()
  53. .add_empty_row()
  54. .build();
  55. let grid_meta = GridMeta {
  56. grid_id: grid_id.clone(),
  57. fields: build_context.field_metas,
  58. blocks: vec![build_context.grid_block],
  59. };
  60. let grid_meta_delta = make_grid_delta(&grid_meta);
  61. let _: GridMeta = serde_json::from_str(&grid_meta_delta.to_str().unwrap()).unwrap();
  62. let grid_block_meta_delta = make_block_meta_delta(&build_context.grid_block_meta);
  63. let _: GridBlockMeta = serde_json::from_str(&grid_block_meta_delta.to_str().unwrap()).unwrap();
  64. }
  65. }