use libc::c_char;
use std::ffi::CString;
use std::ptr;
use crate::definition_api::{DefinitionsIter, rdx_definitions_iter_new_from_ids};
use crate::graph_api::{GraphPointer, with_graph};
use rubydex::model::ids::UriId;
#[derive(Debug)]
pub struct DocumentsIter {
entries: Box<[u64]>,
index: usize,
}
iterator!(DocumentsIter, entries: u64);
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rdx_graph_documents_iter_len(iter: *const DocumentsIter) -> usize {
unsafe { DocumentsIter::len(iter) }
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rdx_graph_documents_iter_next(iter: *mut DocumentsIter, out: *mut u64) -> bool {
unsafe { DocumentsIter::next(iter, out) }
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rdx_graph_documents_iter_free(iter: *mut DocumentsIter) {
unsafe { DocumentsIter::free(iter) }
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rdx_document_uri(pointer: GraphPointer, uri_id: u64) -> *const c_char {
with_graph(pointer, |graph| {
let uri_id = UriId::new(uri_id);
if let Some(doc) = graph.documents().get(&uri_id) {
CString::new(doc.uri()).unwrap().into_raw().cast_const()
} else {
ptr::null()
}
})
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rdx_document_definitions_iter_new(pointer: GraphPointer, uri_id: u64) -> *mut DefinitionsIter {
with_graph(pointer, |graph| {
let uri_id = UriId::new(uri_id);
if let Some(doc) = graph.documents().get(&uri_id) {
rdx_definitions_iter_new_from_ids(graph, doc.definitions())
} else {
DefinitionsIter::new(Vec::<_>::new().into_boxed_slice())
}
})
}