field_builder.rs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. use crate::entities::{FieldPB, FieldType};
  2. use crate::services::field::{default_type_option_builder_from_type, TypeOptionBuilder};
  3. use grid_rev_model::FieldRevision;
  4. use indexmap::IndexMap;
  5. pub struct FieldBuilder {
  6. field_rev: FieldRevision,
  7. type_option_builder: Box<dyn TypeOptionBuilder>,
  8. }
  9. pub type BoxTypeOptionBuilder = Box<dyn TypeOptionBuilder + 'static>;
  10. impl FieldBuilder {
  11. pub fn new<T: Into<BoxTypeOptionBuilder>>(type_option_builder: T) -> Self {
  12. let type_option_builder = type_option_builder.into();
  13. let field_type = type_option_builder.field_type();
  14. let width = field_type.default_cell_width();
  15. let field_rev = FieldRevision::new("", "", field_type, width, false);
  16. Self {
  17. field_rev,
  18. type_option_builder,
  19. }
  20. }
  21. pub fn from_field_type(field_type: &FieldType) -> Self {
  22. let type_option_builder = default_type_option_builder_from_type(field_type);
  23. Self::new(type_option_builder)
  24. }
  25. pub fn from_field(field: FieldPB, type_option_builder: Box<dyn TypeOptionBuilder>) -> Self {
  26. let field_rev = FieldRevision {
  27. id: field.id,
  28. name: field.name,
  29. desc: field.desc,
  30. ty: field.field_type.into(),
  31. frozen: field.frozen,
  32. visibility: field.visibility,
  33. width: field.width,
  34. type_options: IndexMap::default(),
  35. is_primary: field.is_primary,
  36. };
  37. Self {
  38. field_rev,
  39. type_option_builder,
  40. }
  41. }
  42. pub fn name(mut self, name: &str) -> Self {
  43. self.field_rev.name = name.to_owned();
  44. self
  45. }
  46. pub fn desc(mut self, desc: &str) -> Self {
  47. self.field_rev.desc = desc.to_owned();
  48. self
  49. }
  50. pub fn primary(mut self, is_primary: bool) -> Self {
  51. self.field_rev.is_primary = is_primary;
  52. self
  53. }
  54. pub fn visibility(mut self, visibility: bool) -> Self {
  55. self.field_rev.visibility = visibility;
  56. self
  57. }
  58. pub fn width(mut self, width: i32) -> Self {
  59. self.field_rev.width = width;
  60. self
  61. }
  62. pub fn frozen(mut self, frozen: bool) -> Self {
  63. self.field_rev.frozen = frozen;
  64. self
  65. }
  66. pub fn build(self) -> FieldRevision {
  67. let mut field_rev = self.field_rev;
  68. field_rev.insert_type_option(self.type_option_builder.serializer());
  69. field_rev
  70. }
  71. }