field_builder.rs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. use crate::services::field::type_options::*;
  2. use bytes::Bytes;
  3. use flowy_grid_data_model::entities::{
  4. Field, FieldMeta, FieldType, TypeOptionDataByFieldTypeId, TypeOptionDataEntry, TypeOptionDataFrom,
  5. };
  6. pub struct FieldBuilder {
  7. field_meta: FieldMeta,
  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_meta = FieldMeta::new("", "", type_option_builder.field_type());
  15. Self {
  16. field_meta,
  17. type_option_builder,
  18. }
  19. }
  20. pub fn from_field_type(field_type: &FieldType) -> Self {
  21. let type_option_builder = default_type_option_builder_from_type(field_type);
  22. Self::new(type_option_builder)
  23. }
  24. pub fn from_field(field: Field, type_option_builder: Box<dyn TypeOptionBuilder>) -> Self {
  25. let field_meta = FieldMeta {
  26. id: field.id,
  27. name: field.name,
  28. desc: field.desc,
  29. field_type: field.field_type,
  30. frozen: field.frozen,
  31. visibility: field.visibility,
  32. width: field.width,
  33. type_option_by_field_type_id: TypeOptionDataByFieldTypeId::default(),
  34. };
  35. Self {
  36. field_meta,
  37. type_option_builder,
  38. }
  39. }
  40. pub fn name(mut self, name: &str) -> Self {
  41. self.field_meta.name = name.to_owned();
  42. self
  43. }
  44. pub fn desc(mut self, desc: &str) -> Self {
  45. self.field_meta.desc = desc.to_owned();
  46. self
  47. }
  48. pub fn visibility(mut self, visibility: bool) -> Self {
  49. self.field_meta.visibility = visibility;
  50. self
  51. }
  52. pub fn width(mut self, width: i32) -> Self {
  53. self.field_meta.width = width;
  54. self
  55. }
  56. pub fn frozen(mut self, frozen: bool) -> Self {
  57. self.field_meta.frozen = frozen;
  58. self
  59. }
  60. pub fn build(self) -> FieldMeta {
  61. debug_assert_eq!(self.field_meta.field_type, self.type_option_builder.field_type());
  62. let mut field_meta = self.field_meta;
  63. field_meta
  64. .type_option_by_field_type_id
  65. .insert_entry(self.type_option_builder.entry());
  66. field_meta
  67. }
  68. }
  69. pub trait TypeOptionBuilder {
  70. fn field_type(&self) -> FieldType;
  71. fn entry(&self) -> &dyn TypeOptionDataEntry;
  72. }
  73. pub fn default_type_option_builder_from_type(field_type: &FieldType) -> Box<dyn TypeOptionBuilder> {
  74. let s: String = match field_type {
  75. FieldType::RichText => RichTextTypeOption::default().into(),
  76. FieldType::Number => NumberTypeOption::default().into(),
  77. FieldType::DateTime => DateTypeOption::default().into(),
  78. FieldType::SingleSelect => SingleSelectTypeOption::default().into(),
  79. FieldType::MultiSelect => MultiSelectTypeOption::default().into(),
  80. FieldType::Checkbox => CheckboxTypeOption::default().into(),
  81. };
  82. type_option_builder_from_json_str(&s, field_type)
  83. }
  84. pub fn type_option_builder_from_json_str(s: &str, field_type: &FieldType) -> Box<dyn TypeOptionBuilder> {
  85. match field_type {
  86. FieldType::RichText => Box::new(RichTextTypeOptionBuilder::from_json_str(s)),
  87. FieldType::Number => Box::new(NumberTypeOptionBuilder::from_json_str(s)),
  88. FieldType::DateTime => Box::new(DateTypeOptionBuilder::from_json_str(s)),
  89. FieldType::SingleSelect => Box::new(SingleSelectTypeOptionBuilder::from_json_str(s)),
  90. FieldType::MultiSelect => Box::new(MultiSelectTypeOptionBuilder::from_json_str(s)),
  91. FieldType::Checkbox => Box::new(CheckboxTypeOptionBuilder::from_json_str(s)),
  92. }
  93. }
  94. pub fn type_option_builder_from_bytes<T: Into<Bytes>>(bytes: T, field_type: &FieldType) -> Box<dyn TypeOptionBuilder> {
  95. let bytes = bytes.into();
  96. match field_type {
  97. FieldType::RichText => Box::new(RichTextTypeOptionBuilder::from_protobuf_bytes(bytes)),
  98. FieldType::Number => Box::new(NumberTypeOptionBuilder::from_protobuf_bytes(bytes)),
  99. FieldType::DateTime => Box::new(DateTypeOptionBuilder::from_protobuf_bytes(bytes)),
  100. FieldType::SingleSelect => Box::new(SingleSelectTypeOptionBuilder::from_protobuf_bytes(bytes)),
  101. FieldType::MultiSelect => Box::new(MultiSelectTypeOptionBuilder::from_protobuf_bytes(bytes)),
  102. FieldType::Checkbox => Box::new(CheckboxTypeOptionBuilder::from_protobuf_bytes(bytes)),
  103. }
  104. }