Skip to content

Commit

Permalink
WIP codes_handle iterator with index works
Browse files Browse the repository at this point in the history
  • Loading branch information
Quba1 committed Jan 28, 2024
1 parent 8909556 commit 640122f
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 18 deletions.
37 changes: 33 additions & 4 deletions src/codes_handle/iterator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ use crate::{
errors::CodesError,
intermediate_bindings::{
codes_get_message_copy, codes_handle_delete, codes_handle_new_from_file,
codes_handle_new_from_message_copy,
codes_handle_new_from_message_copy, codes_index::codes_iter_next_from_index,
},
CodesIndex,
};

use super::GribFile;
Expand Down Expand Up @@ -85,13 +86,41 @@ impl FallibleIterator for CodesHandle<GribFile> {
type Error = CodesError;

fn next(&mut self) -> Result<Option<Self::Item>, Self::Error> {
let file_handle;
let new_eccodes_handle;
unsafe {
codes_handle_delete(self.eccodes_handle)?;
file_handle = codes_handle_new_from_file(self.source.pointer, self.product_kind);
new_eccodes_handle = codes_handle_new_from_file(self.source.pointer, self.product_kind);
}

match file_handle {
match new_eccodes_handle {
Ok(h) => {
self.eccodes_handle = h;

if self.eccodes_handle.is_null() {
Ok(None)
} else {
let message = get_message_from_handle(h);
Ok(Some(message))
}
}
Err(e) => Err(e),
}
}
}

impl FallibleIterator for CodesHandle<CodesIndex> {
type Item = KeyedMessage;

type Error = CodesError;

fn next(&mut self) -> Result<Option<Self::Item>, Self::Error> {
let new_eccodes_handle;
unsafe {
codes_handle_delete(self.eccodes_handle)?;
new_eccodes_handle = codes_iter_next_from_index(self.source.pointer);
}

match new_eccodes_handle {
Ok(h) => {
self.eccodes_handle = h;

Expand Down
4 changes: 0 additions & 4 deletions src/codes_handle/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -357,10 +357,6 @@ impl SpecialDrop for CodesIndex {
fn spec_drop(&mut self) {
dbg!("CodesIndex drop");

if self.pointer.is_null() {
return;
}

unsafe {
codes_index_delete(self.pointer);
}
Expand Down
28 changes: 18 additions & 10 deletions src/codes_index/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@ use crate::{
codes_handle::SpecialDrop,
errors::CodesError,
intermediate_bindings::codes_index::{
codes_index_add_file, codes_index_delete, codes_index_new, codes_index_read,
codes_index_add_file, codes_index_new, codes_index_read,
codes_index_select_double, codes_index_select_long, codes_index_select_string,
},
};
use eccodes_sys::codes_index;
use std::{path::Path, ptr::null_mut};
use fs2::FileExt;
use std::{fs::OpenOptions, path::Path};

#[derive(Debug)]
#[cfg_attr(docsrs, doc(cfg(feature = "ec_index")))]
Expand Down Expand Up @@ -138,6 +139,7 @@ mod tests {
}

#[test]
#[ignore]
fn add_file() {
let keys = vec!["shortName", "typeOfLevel", "level", "stepType"];
let index = CodesIndex::new_from_keys(&keys).unwrap();
Expand Down Expand Up @@ -165,18 +167,24 @@ mod tests {
}

#[test]
fn iterate_handle_from_iter() {
fn iterate_handle_from_index() {
let file_path = Path::new("./data/iceland-surface.idx");
let mut index = CodesIndex::read_from_file(file_path).unwrap();
index.select("shortName", "2t").unwrap();
index.select("typeOfLevel", "surface").unwrap();
index.select("level", 0).unwrap();
index.select("stepType", "instant").unwrap();
let handle = CodesHandle::new_from_index(index, ProductKind::GRIB);
let index = CodesIndex::read_from_file(file_path)
.unwrap()
.select("shortName", "2t")
.unwrap()
.select("typeOfLevel", "surface")
.unwrap()
.select("level", 0)
.unwrap()
.select("stepType", "instant")
.unwrap();

let handle = CodesHandle::new_from_index(index, ProductKind::GRIB).unwrap();

let counter = handle.count().unwrap();

println!("Counter: {}", counter);
println!("Counter: {:?}", counter);
}

// {
Expand Down
22 changes: 22 additions & 0 deletions src/intermediate_bindings/codes_index.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ pub unsafe fn codes_index_read(filename: &str) -> Result<*mut codes_index, Codes
}

pub unsafe fn codes_index_delete(index: *mut codes_index) {
if index.is_null() {
return;
}

eccodes_sys::codes_index_delete(index);
}

Expand Down Expand Up @@ -118,3 +122,21 @@ pub unsafe fn codes_handle_new_from_index(
}
Ok(codes_handle)
}

pub unsafe fn codes_iter_next_from_index(
index: *mut codes_index,
) -> Result<*mut codes_handle, CodesError> {
let mut error_code: i32 = 0;

let codes_handle = eccodes_sys::codes_handle_new_from_index(index, &mut error_code);

if error_code == -43 {
return Ok(codes_handle);
}

if error_code != 0 {
let err: CodesInternal = FromPrimitive::from_i32(error_code).unwrap();
return Err(err.into());
}
Ok(codes_handle)
}
4 changes: 4 additions & 0 deletions src/intermediate_bindings/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,10 @@ pub unsafe fn codes_handle_new_from_file(
}

pub unsafe fn codes_handle_delete(handle: *mut codes_handle) -> Result<(), CodesError> {
if handle.is_null() {
return Ok(());
}

let error_code = eccodes_sys::codes_handle_delete(handle);

if error_code != 0 {
Expand Down

0 comments on commit 640122f

Please sign in to comment.