field_builder.rs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. use crate::entities::{FieldPB, FieldType};
  2. use crate::services::field::type_options::*;
  3. use bytes::Bytes;
  4. use flowy_grid_data_model::revision::{FieldRevision, TypeOptionDataFormat};
  5. use indexmap::IndexMap;
  6. pub struct FieldBuilder {
  7. field_rev: FieldRevision,
  8. type_option_builder: Box<dyn TypeOptionBuilder>,
  9. }
  10. pub type BoxTypeOptionBuilder = Box<dyn TypeOptionBuilder + 'static>;
  11. impl FieldBuilder {
  12. pub fn new<T: Into<BoxTypeOptionBuilder>>(type_option_builder: T) -> Self {
  13. let type_option_builder = type_option_builder.into();
  14. let field_type = type_option_builder.field_type();
  15. let width = field_type.default_cell_width();
  16. let field_rev = FieldRevision::new("", "", field_type, width, false);
  17. Self {
  18. field_rev,
  19. type_option_builder,
  20. }
  21. }
  22. pub fn from_field_type(field_type: &FieldType) -> Self {
  23. let type_option_builder = default_type_option_builder_from_type(field_type);
  24. Self::new(type_option_builder)
  25. }
  26. pub fn from_field(field: FieldPB, type_option_builder: Box<dyn TypeOptionBuilder>) -> Self {
  27. let field_rev = FieldRevision {
  28. id: field.id,
  29. name: field.name,
  30. desc: field.desc,
  31. ty: field.field_type.into(),
  32. frozen: field.frozen,
  33. visibility: field.visibility,
  34. width: field.width,
  35. type_options: IndexMap::default(),
  36. is_primary: field.is_primary,
  37. };
  38. Self {
  39. field_rev,
  40. type_option_builder,
  41. }
  42. }
  43. pub fn name(mut self, name: &str) -> Self {
  44. self.field_rev.name = name.to_owned();
  45. self
  46. }
  47. pub fn desc(mut self, desc: &str) -> Self {
  48. self.field_rev.desc = desc.to_owned();
  49. self
  50. }
  51. pub fn primary(mut self, is_primary: bool) -> Self {
  52. self.field_rev.is_primary = is_primary;
  53. self
  54. }
  55. pub fn visibility(mut self, visibility: bool) -> Self {
  56. self.field_rev.visibility = visibility;
  57. self
  58. }
  59. pub fn width(mut self, width: i32) -> Self {
  60. self.field_rev.width = width;
  61. self
  62. }
  63. pub fn frozen(mut self, frozen: bool) -> Self {
  64. self.field_rev.frozen = frozen;
  65. self
  66. }
  67. pub fn build(self) -> FieldRevision {
  68. let mut field_rev = self.field_rev;
  69. field_rev.insert_type_option(self.type_option_builder.data_format());
  70. field_rev
  71. }
  72. }
  73. pub trait TypeOptionBuilder {
  74. fn field_type(&self) -> FieldType;
  75. fn data_format(&self) -> &dyn TypeOptionDataFormat;
  76. }
  77. pub fn default_type_option_builder_from_type(field_type: &FieldType) -> Box<dyn TypeOptionBuilder> {
  78. let s: String = match field_type {
  79. FieldType::RichText => RichTextTypeOptionPB::default().into(),
  80. FieldType::Number => NumberTypeOptionPB::default().into(),
  81. FieldType::DateTime => DateTypeOptionPB::default().into(),
  82. FieldType::SingleSelect => SingleSelectTypeOptionPB::default().into(),
  83. FieldType::MultiSelect => MultiSelectTypeOptionPB::default().into(),
  84. FieldType::Checkbox => CheckboxTypeOptionPB::default().into(),
  85. FieldType::URL => URLTypeOptionPB::default().into(),
  86. };
  87. type_option_builder_from_json_str(&s, field_type)
  88. }
  89. pub fn type_option_builder_from_json_str(s: &str, field_type: &FieldType) -> Box<dyn TypeOptionBuilder> {
  90. match field_type {
  91. FieldType::RichText => Box::new(RichTextTypeOptionBuilder::from_json_str(s)),
  92. FieldType::Number => Box::new(NumberTypeOptionBuilder::from_json_str(s)),
  93. FieldType::DateTime => Box::new(DateTypeOptionBuilder::from_json_str(s)),
  94. FieldType::SingleSelect => Box::new(SingleSelectTypeOptionBuilder::from_json_str(s)),
  95. FieldType::MultiSelect => Box::new(MultiSelectTypeOptionBuilder::from_json_str(s)),
  96. FieldType::Checkbox => Box::new(CheckboxTypeOptionBuilder::from_json_str(s)),
  97. FieldType::URL => Box::new(URLTypeOptionBuilder::from_json_str(s)),
  98. }
  99. }
  100. pub fn type_option_builder_from_bytes<T: Into<Bytes>>(bytes: T, field_type: &FieldType) -> Box<dyn TypeOptionBuilder> {
  101. let bytes = bytes.into();
  102. match field_type {
  103. FieldType::RichText => Box::new(RichTextTypeOptionBuilder::from_protobuf_bytes(bytes)),
  104. FieldType::Number => Box::new(NumberTypeOptionBuilder::from_protobuf_bytes(bytes)),
  105. FieldType::DateTime => Box::new(DateTypeOptionBuilder::from_protobuf_bytes(bytes)),
  106. FieldType::SingleSelect => Box::new(SingleSelectTypeOptionBuilder::from_protobuf_bytes(bytes)),
  107. FieldType::MultiSelect => Box::new(MultiSelectTypeOptionBuilder::from_protobuf_bytes(bytes)),
  108. FieldType::Checkbox => Box::new(CheckboxTypeOptionBuilder::from_protobuf_bytes(bytes)),
  109. FieldType::URL => Box::new(URLTypeOptionBuilder::from_protobuf_bytes(bytes)),
  110. }
  111. }