1use crate::{FieldSet, StampMode};
2use neo4rs::{Node, Query};
3
4pub trait NodeEntity: FieldSet + TryFrom<Node> {
6 type Id: NodeId<T = Self>;
7
8 fn identifier(&self) -> Self::Id;
16
17 fn into_identifier(self) -> Self::Id {
19 self.into()
20 }
21
22 fn create(&self) -> Query {
23 let q = Query::new(format!(
24 "CREATE (n:{})",
25 Self::to_query_obj(None, StampMode::Create),
26 ));
27 self.add_values_to_params(q, None, StampMode::Create)
28 }
29
30 fn update(&self) -> Query {
34 let q = Query::new(format!(
35 "MATCH (n:{}) SET n += {{ {} }}",
36 Self::Id::to_query_obj(None, StampMode::Read),
37 Self::to_query_fields(None, StampMode::Update),
38 ));
39 self.add_values_to_params(q, None, StampMode::Update)
40 }
41}
42
43pub trait NodeId: FieldSet + From<Self::T> + TryFrom<Node> {
45 type T: NodeEntity<Id = Self>;
46
47 fn read(&self) -> Query {
49 let q = Query::new(format!(
50 "MATCH (n:{}) RETURN n",
51 Self::to_query_obj(None, StampMode::Read)
52 ));
53 self.add_values_to_params(q, None, StampMode::Read)
54 }
55
56 fn delete(&self) -> Query {
58 let q = Query::new(format!(
59 "MATCH (n:{}) DETACH DELETE n",
60 Self::to_query_obj(None, StampMode::Read)
61 ));
62 self.add_values_to_params(q, None, StampMode::Read)
63 }
64}