1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
use std::ffi::CString;
use crate::memgraph::*;
use crate::mgp::*;
use crate::value::*;
#[double]
use crate::mgp::ffi;
use mockall_double::double;
#[derive(Debug)]
pub struct Property {
pub name: CString,
pub value: Value,
}
pub struct PropertiesIterator {
ptr: *mut mgp_properties_iterator,
is_first: bool,
memgraph: Memgraph,
}
impl PropertiesIterator {
pub fn new(ptr: *mut mgp_properties_iterator, memgraph: &Memgraph) -> PropertiesIterator {
PropertiesIterator {
ptr,
is_first: true,
memgraph: memgraph.clone(),
}
}
}
impl Drop for PropertiesIterator {
fn drop(&mut self) {
unsafe {
if !self.ptr.is_null() {
ffi::mgp_properties_iterator_destroy(self.ptr);
}
}
}
}
impl Iterator for PropertiesIterator {
type Item = Property;
fn next(&mut self) -> Option<Property> {
unsafe {
let data: *const mgp_property;
if self.is_first {
self.is_first = false;
data = ffi::mgp_properties_iterator_get(self.ptr);
} else {
data = ffi::mgp_properties_iterator_next(self.ptr);
}
if data.is_null() {
None
} else {
let data_ref = data.as_ref().unwrap();
Some(Property {
name: match create_cstring(data_ref.name) {
Ok(v) => v,
Err(_) => panic!("Unable to provide next property. Name creation problem."),
},
value: match mgp_raw_value_to_value(data_ref.value, &self.memgraph) {
Ok(v) => v,
Err(_) => panic!("Unable to provide next property. Value create problem."),
},
})
}
}
}
}
#[cfg(test)]
mod tests;