exocore_store/
mutation.rs

1use 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}