1use serde::{Deserialize, Serialize};
4use crate::types::*;
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct AddVertex {
9 pub id: VertexId,
10 pub labels: Vec<Label>,
11 pub props: Properties,
12}
13
14#[derive(Debug, Clone, Serialize, Deserialize)]
16pub struct AddEdge {
17 pub id: EdgeId,
18 pub src: VertexId,
19 pub dst: VertexId,
20 pub label: Label,
21 pub props: Properties,
22}
23
24#[derive(Debug, Clone, Serialize, Deserialize)]
26pub struct UpdateProp {
27 pub id: VertexId, pub key: PropertyKey,
29 pub value: Value,
30}
31
32#[derive(Debug, Clone, Serialize, Deserialize)]
34pub struct Relink {
35 pub edge_id: EdgeId,
36 #[serde(skip_serializing_if = "Option::is_none")]
37 pub new_src: Option<VertexId>,
38 #[serde(skip_serializing_if = "Option::is_none")]
39 pub new_dst: Option<VertexId>,
40}
41
42#[derive(Debug, Clone, Serialize, Deserialize)]
44pub struct Patch {
45 pub adds: Adds,
46 pub dels: Dels,
47 pub updates: Updates,
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize, Default)]
52pub struct Adds {
53 pub vertices: Vec<AddVertex>,
54 pub edges: Vec<AddEdge>,
55}
56
57#[derive(Debug, Clone, Serialize, Deserialize, Default)]
59pub struct Dels {
60 pub vertices: Vec<VertexId>,
61 pub edges: Vec<EdgeId>,
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize, Default)]
66pub struct Updates {
67 pub props: Vec<UpdateProp>,
68 pub relinks: Vec<Relink>,
69}
70
71impl Patch {
72 pub fn empty() -> Self {
74 Self {
75 adds: Adds::default(),
76 dels: Dels::default(),
77 updates: Updates::default(),
78 }
79 }
80
81 pub fn is_empty(&self) -> bool {
83 self.adds.vertices.is_empty()
84 && self.adds.edges.is_empty()
85 && self.dels.vertices.is_empty()
86 && self.dels.edges.is_empty()
87 && self.updates.props.is_empty()
88 && self.updates.relinks.is_empty()
89 }
90
91 pub fn merge(mut self, other: Patch) -> Self {
93 self.adds.vertices.extend(other.adds.vertices);
94 self.adds.edges.extend(other.adds.edges);
95 self.dels.vertices.extend(other.dels.vertices);
96 self.dels.edges.extend(other.dels.edges);
97 self.updates.props.extend(other.updates.props);
98 self.updates.relinks.extend(other.updates.relinks);
99 self
100 }
101}