database_builder.rs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. use crate::errors::{SyncError, SyncResult};
  2. use database_model::{
  3. BuildDatabaseContext, DatabaseBlockMetaRevision, DatabaseBlockRevision, FieldRevision,
  4. LayoutSetting, RowRevision,
  5. };
  6. use std::sync::Arc;
  7. pub struct DatabaseBuilder {
  8. build_context: BuildDatabaseContext,
  9. }
  10. impl std::default::Default for DatabaseBuilder {
  11. fn default() -> Self {
  12. let mut build_context = BuildDatabaseContext::new();
  13. let block_meta = DatabaseBlockMetaRevision::new();
  14. let block_meta_data = DatabaseBlockRevision {
  15. block_id: block_meta.block_id.clone(),
  16. rows: vec![],
  17. };
  18. build_context.block_metas.push(block_meta);
  19. build_context.blocks.push(block_meta_data);
  20. DatabaseBuilder { build_context }
  21. }
  22. }
  23. impl DatabaseBuilder {
  24. pub fn new() -> Self {
  25. Self::default()
  26. }
  27. pub fn add_field(&mut self, field: FieldRevision) {
  28. self.build_context.field_revs.push(Arc::new(field));
  29. }
  30. pub fn add_row(&mut self, row_rev: RowRevision) {
  31. let block_meta_rev = self.build_context.block_metas.first_mut().unwrap();
  32. let block_rev = self.build_context.blocks.first_mut().unwrap();
  33. block_rev.rows.push(Arc::new(row_rev));
  34. block_meta_rev.row_count += 1;
  35. }
  36. pub fn add_empty_row(&mut self) {
  37. let row = RowRevision::new(self.block_id());
  38. self.add_row(row);
  39. }
  40. pub fn field_revs(&self) -> &Vec<Arc<FieldRevision>> {
  41. &self.build_context.field_revs
  42. }
  43. pub fn block_id(&self) -> &str {
  44. &self.build_context.block_metas.first().unwrap().block_id
  45. }
  46. pub fn set_layout_setting(&mut self, layout_setting: LayoutSetting) {
  47. self.build_context.layout_setting = layout_setting;
  48. }
  49. pub fn build(self) -> BuildDatabaseContext {
  50. self.build_context
  51. }
  52. }
  53. #[allow(dead_code)]
  54. fn check_rows(fields: &[FieldRevision], rows: &[RowRevision]) -> SyncResult<()> {
  55. let field_ids = fields
  56. .iter()
  57. .map(|field| &field.id)
  58. .collect::<Vec<&String>>();
  59. for row in rows {
  60. let cell_field_ids = row.cells.keys().into_iter().collect::<Vec<&String>>();
  61. if cell_field_ids != field_ids {
  62. let msg = format!("{:?} contains invalid cells", row);
  63. return Err(SyncError::internal().context(msg));
  64. }
  65. }
  66. Ok(())
  67. }