use std::ffi::CString;
use crate::memgraph::*;
use crate::mgp::*;
use crate::value::*;
#[double]
use crate::mgp::ffi;
use mockall_double::double;
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(crate) fn new(
ptr: *mut mgp_properties_iterator,
memgraph: &Memgraph,
) -> PropertiesIterator {
#[cfg(not(test))]
assert!(
!ptr.is_null(),
"Unable to create properties iterator because the given pointer is null."
);
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 = if self.is_first {
self.is_first = false;
ffi::mgp_properties_iterator_get(self.ptr)
} else {
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;