operations.rs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. use crate::{InputPropertyValue, InputValue, PropertyId, SchemaId, Trait, VecInputValue};
  2. use codec::{Decode, Encode};
  3. use rstd::collections::btree_map::BTreeMap;
  4. use rstd::prelude::*;
  5. #[derive(Encode, Decode, Eq, PartialEq, Clone, Debug)]
  6. pub enum ParametrizedPropertyValue<T: Trait> {
  7. /// Same fields as normal InputPropertyValue
  8. InputPropertyValue(InputPropertyValue<T>),
  9. /// This is the index of an operation creating an entity in the transaction/batch operations
  10. InternalEntityJustAdded(u32), // should really be usize but it doesn't have Encode/Decode support
  11. /// Vector of mix of Entities already existing and just added in a recent operation
  12. InternalEntityVec(Vec<ParameterizedEntity<T>>),
  13. }
  14. #[derive(Encode, Decode, Eq, PartialEq, Clone, Debug)]
  15. pub enum ParameterizedEntity<T: Trait> {
  16. InternalEntityJustAdded(u32),
  17. ExistingEntity(T::EntityId),
  18. }
  19. #[derive(Encode, Decode, Eq, PartialEq, Clone, Debug)]
  20. pub struct ParametrizedClassPropertyValue<T: Trait> {
  21. /// Index is into properties vector of class.
  22. pub in_class_index: PropertyId,
  23. /// InputValue of property with index `in_class_index` in a given class.
  24. pub value: ParametrizedPropertyValue<T>,
  25. }
  26. #[derive(Encode, Decode, Eq, PartialEq, Clone, Debug)]
  27. pub struct CreateEntityOperation<T: Trait> {
  28. pub class_id: T::ClassId,
  29. }
  30. #[derive(Encode, Decode, Eq, PartialEq, Clone, Debug)]
  31. pub struct UpdatePropertyValuesOperation<T: Trait> {
  32. pub entity_id: ParameterizedEntity<T>,
  33. pub new_parametrized_property_values: Vec<ParametrizedClassPropertyValue<T>>,
  34. }
  35. #[derive(Encode, Decode, Eq, PartialEq, Clone, Debug)]
  36. pub struct AddSchemaSupportToEntityOperation<T: Trait> {
  37. pub entity_id: ParameterizedEntity<T>,
  38. pub schema_id: SchemaId,
  39. pub parametrized_property_values: Vec<ParametrizedClassPropertyValue<T>>,
  40. }
  41. #[derive(Encode, Decode, Eq, PartialEq, Clone, Debug)]
  42. pub enum OperationType<T: Trait> {
  43. CreateEntity(CreateEntityOperation<T>),
  44. UpdatePropertyValues(UpdatePropertyValuesOperation<T>),
  45. AddSchemaSupportToEntity(AddSchemaSupportToEntityOperation<T>),
  46. }
  47. pub fn parametrized_entity_to_entity_id<T: Trait>(
  48. created_entities: &BTreeMap<usize, T::EntityId>,
  49. entity: ParameterizedEntity<T>,
  50. ) -> Result<T::EntityId, &'static str> {
  51. match entity {
  52. ParameterizedEntity::ExistingEntity(entity_id) => Ok(entity_id),
  53. ParameterizedEntity::InternalEntityJustAdded(op_index_u32) => {
  54. let op_index = op_index_u32 as usize;
  55. Ok(*created_entities
  56. .get(&op_index)
  57. .ok_or("EntityNotCreatedByOperation")?)
  58. }
  59. }
  60. }
  61. pub fn parametrized_property_values_to_property_values<T: Trait>(
  62. created_entities: &BTreeMap<usize, T::EntityId>,
  63. parametrized_property_values: Vec<ParametrizedClassPropertyValue<T>>,
  64. ) -> Result<BTreeMap<PropertyId, InputPropertyValue<T>>, &'static str> {
  65. let mut class_property_values = BTreeMap::new();
  66. for parametrized_class_property_value in parametrized_property_values.into_iter() {
  67. let property_value = match parametrized_class_property_value.value {
  68. ParametrizedPropertyValue::InputPropertyValue(value) => value,
  69. ParametrizedPropertyValue::InternalEntityJustAdded(
  70. entity_created_in_operation_index,
  71. ) => {
  72. // Verify that referenced entity was indeed created created
  73. let op_index = entity_created_in_operation_index as usize;
  74. let entity_id = created_entities
  75. .get(&op_index)
  76. .ok_or("EntityNotCreatedByOperation")?;
  77. InputPropertyValue::Single(InputValue::Reference(*entity_id))
  78. }
  79. ParametrizedPropertyValue::InternalEntityVec(parametrized_entities) => {
  80. let mut entities: Vec<T::EntityId> = vec![];
  81. for parametrized_entity in parametrized_entities.into_iter() {
  82. match parametrized_entity {
  83. ParameterizedEntity::ExistingEntity(id) => entities.push(id),
  84. ParameterizedEntity::InternalEntityJustAdded(
  85. entity_created_in_operation_index,
  86. ) => {
  87. let op_index = entity_created_in_operation_index as usize;
  88. let entity_id = created_entities
  89. .get(&op_index)
  90. .ok_or("EntityNotCreatedByOperation")?;
  91. entities.push(*entity_id);
  92. }
  93. }
  94. }
  95. InputPropertyValue::Vector(VecInputValue::Reference(entities))
  96. }
  97. };
  98. class_property_values.insert(
  99. parametrized_class_property_value.in_class_index,
  100. property_value,
  101. );
  102. }
  103. Ok(class_property_values)
  104. }