field_builder.rs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. use crate::services::field::type_options::*;
  2. use bytes::Bytes;
  3. use flowy_grid_data_model::entities::{FieldMeta, FieldType};
  4. pub struct FieldBuilder {
  5. field_meta: FieldMeta,
  6. type_option_builder: Box<dyn TypeOptionBuilder>,
  7. }
  8. pub type BoxTypeOptionBuilder = Box<dyn TypeOptionBuilder + 'static>;
  9. impl FieldBuilder {
  10. pub fn new<T: Into<BoxTypeOptionBuilder>>(type_option_builder: T) -> Self {
  11. let type_option_builder = type_option_builder.into();
  12. let field_meta = FieldMeta::new("", "", type_option_builder.field_type());
  13. Self {
  14. field_meta,
  15. type_option_builder,
  16. }
  17. }
  18. pub fn from_field_type(field_type: &FieldType) -> Self {
  19. let type_option_builder = default_type_option_builder_from_type(field_type);
  20. Self::new(type_option_builder)
  21. }
  22. pub fn name(mut self, name: &str) -> Self {
  23. self.field_meta.name = name.to_owned();
  24. self
  25. }
  26. pub fn desc(mut self, desc: &str) -> Self {
  27. self.field_meta.desc = desc.to_owned();
  28. self
  29. }
  30. pub fn visibility(mut self, visibility: bool) -> Self {
  31. self.field_meta.visibility = visibility;
  32. self
  33. }
  34. pub fn width(mut self, width: i32) -> Self {
  35. self.field_meta.width = width;
  36. self
  37. }
  38. pub fn frozen(mut self, frozen: bool) -> Self {
  39. self.field_meta.frozen = frozen;
  40. self
  41. }
  42. pub fn build(self) -> FieldMeta {
  43. debug_assert_eq!(self.field_meta.field_type, self.type_option_builder.field_type());
  44. let mut field_meta = self.field_meta;
  45. let type_option_json = self.type_option_builder.build_type_option_str();
  46. field_meta.type_option_json = type_option_json;
  47. field_meta
  48. }
  49. }
  50. pub trait TypeOptionBuilder {
  51. fn field_type(&self) -> FieldType;
  52. fn build_type_option_str(&self) -> String;
  53. fn build_type_option_data(&self) -> Bytes;
  54. }
  55. pub fn default_type_option_builder_from_type(field_type: &FieldType) -> Box<dyn TypeOptionBuilder> {
  56. let s: String = match field_type {
  57. FieldType::RichText => RichTextTypeOption::default().into(),
  58. FieldType::Number => NumberTypeOption::default().into(),
  59. FieldType::DateTime => DateTypeOption::default().into(),
  60. FieldType::SingleSelect => SingleSelectTypeOption::default().into(),
  61. FieldType::MultiSelect => MultiSelectTypeOption::default().into(),
  62. FieldType::Checkbox => CheckboxTypeOption::default().into(),
  63. };
  64. type_option_builder_from_json_str(&s, field_type)
  65. }
  66. pub fn type_option_builder_from_json_str(s: &str, field_type: &FieldType) -> Box<dyn TypeOptionBuilder> {
  67. match field_type {
  68. FieldType::RichText => Box::new(RichTextTypeOptionBuilder::from_json_str(s)),
  69. FieldType::Number => Box::new(NumberTypeOptionBuilder::from_json_str(s)),
  70. FieldType::DateTime => Box::new(DateTypeOptionBuilder::from_json_str(s)),
  71. FieldType::SingleSelect => Box::new(SingleSelectTypeOptionBuilder::from_json_str(s)),
  72. FieldType::MultiSelect => Box::new(MultiSelectTypeOptionBuilder::from_json_str(s)),
  73. FieldType::Checkbox => Box::new(CheckboxTypeOptionBuilder::from_json_str(s)),
  74. }
  75. }
  76. pub fn type_option_builder_from_bytes(bytes: Bytes, field_type: &FieldType) -> Box<dyn TypeOptionBuilder> {
  77. match field_type {
  78. FieldType::RichText => Box::new(RichTextTypeOptionBuilder::from_bytes(bytes)),
  79. FieldType::Number => Box::new(NumberTypeOptionBuilder::from_bytes(bytes)),
  80. FieldType::DateTime => Box::new(DateTypeOptionBuilder::from_bytes(bytes)),
  81. FieldType::SingleSelect => Box::new(SingleSelectTypeOptionBuilder::from_bytes(bytes)),
  82. FieldType::MultiSelect => Box::new(MultiSelectTypeOptionBuilder::from_bytes(bytes)),
  83. FieldType::Checkbox => Box::new(CheckboxTypeOptionBuilder::from_bytes(bytes)),
  84. }
  85. }
  86. pub fn type_option_data_from_str(s: &str, field_type: &FieldType) -> Vec<u8> {
  87. let builder = type_option_builder_from_json_str(s, field_type);
  88. builder.build_type_option_data().to_vec()
  89. }
  90. pub fn type_option_json_str_from_bytes(bytes: Vec<u8>, field_type: &FieldType) -> String {
  91. let builder = type_option_builder_from_bytes(Bytes::from(bytes), field_type);
  92. builder.build_type_option_str()
  93. }