exocore_store/
mutation.rs1use exocore_protos::{
2 generated::exocore_store::{
3 entity_mutation::Mutation, DeleteEntityMutation, DeleteTraitMutation, EntityMutation,
4 MutationRequest, PutTraitMutation, Trait,
5 },
6 store::DeleteOperationsMutation,
7};
8
9use crate::entity::{EntityId, TraitId};
10
11pub type OperationId = u64;
12
13pub struct MutationBuilder {
14 request: MutationRequest,
15}
16
17impl MutationBuilder {
18 pub fn new() -> MutationBuilder {
19 MutationBuilder {
20 request: MutationRequest {
21 mutations: vec![],
22 wait_indexed: false,
23 return_entities: false,
24 common_entity_id: false,
25 },
26 }
27 }
28
29 pub fn put_trait<E: Into<EntityId>>(mut self, entity_id: E, trt: Trait) -> MutationBuilder {
30 self.request.mutations.push(EntityMutation {
31 entity_id: entity_id.into(),
32 mutation: Some(Mutation::PutTrait(PutTraitMutation { r#trait: Some(trt) })),
33 });
34
35 self
36 }
37
38 pub fn delete_trait<E: Into<EntityId>, T: Into<TraitId>>(
39 mut self,
40 entity_id: E,
41 trait_id: T,
42 ) -> MutationBuilder {
43 self.request.mutations.push(EntityMutation {
44 entity_id: entity_id.into(),
45 mutation: Some(Mutation::DeleteTrait(DeleteTraitMutation {
46 trait_id: trait_id.into(),
47 })),
48 });
49
50 self
51 }
52
53 pub fn delete_entity<E: Into<EntityId>>(mut self, entity_id: E) -> MutationBuilder {
54 self.request.mutations.push(EntityMutation {
55 entity_id: entity_id.into(),
56 mutation: Some(Mutation::DeleteEntity(DeleteEntityMutation {})),
57 });
58
59 self
60 }
61
62 pub fn use_common_entity_id(mut self) -> MutationBuilder {
63 self.request.common_entity_id = true;
64
65 self
66 }
67
68 pub fn return_entities(mut self) -> MutationBuilder {
69 self.request.return_entities = true;
70 self
71 }
72
73 #[allow(unused)]
74 pub(crate) fn delete_operations<E: Into<EntityId>>(
75 mut self,
76 entity_id: E,
77 operation_ids: Vec<OperationId>,
78 ) -> MutationBuilder {
79 self.request.mutations.push(EntityMutation {
80 entity_id: entity_id.into(),
81 mutation: Some(Mutation::DeleteOperations(DeleteOperationsMutation {
82 operation_ids,
83 })),
84 });
85
86 self
87 }
88
89 #[cfg(test)]
90 pub(crate) fn fail_mutation<E: Into<EntityId>>(mut self, entity_id: E) -> MutationBuilder {
91 self.request.mutations.push(EntityMutation {
92 entity_id: entity_id.into(),
93 mutation: Some(Mutation::Test(
94 exocore_protos::generated::exocore_store::TestMutation { success: false },
95 )),
96 });
97
98 self
99 }
100
101 pub fn build(self) -> MutationRequest {
102 self.request
103 }
104}
105
106impl Default for MutationBuilder {
107 fn default() -> Self {
108 MutationBuilder::new()
109 }
110}
111
112pub struct MutationRequestLike(pub MutationRequest);
113
114impl From<MutationRequest> for MutationRequestLike {
115 fn from(req: MutationRequest) -> Self {
116 MutationRequestLike(req)
117 }
118}
119
120impl From<EntityMutation> for MutationRequestLike {
121 fn from(mutation: EntityMutation) -> Self {
122 MutationRequestLike(MutationRequest {
123 mutations: vec![mutation],
124 ..Default::default()
125 })
126 }
127}
128
129impl From<MutationBuilder> for MutationRequestLike {
130 fn from(builder: MutationBuilder) -> Self {
131 MutationRequestLike(builder.build())
132 }
133}
134
135impl std::ops::Deref for MutationRequestLike {
136 type Target = MutationRequest;
137
138 fn deref(&self) -> &Self::Target {
139 &self.0
140 }
141}