Skip to content

Commit 640122f

Browse files
committed
WIP codes_handle iterator with index works
1 parent 8909556 commit 640122f

File tree

5 files changed

+77
-18
lines changed

5 files changed

+77
-18
lines changed

src/codes_handle/iterator.rs

+33-4
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ use crate::{
66
errors::CodesError,
77
intermediate_bindings::{
88
codes_get_message_copy, codes_handle_delete, codes_handle_new_from_file,
9-
codes_handle_new_from_message_copy,
9+
codes_handle_new_from_message_copy, codes_index::codes_iter_next_from_index,
1010
},
11+
CodesIndex,
1112
};
1213

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

8788
fn next(&mut self) -> Result<Option<Self::Item>, Self::Error> {
88-
let file_handle;
89+
let new_eccodes_handle;
8990
unsafe {
9091
codes_handle_delete(self.eccodes_handle)?;
91-
file_handle = codes_handle_new_from_file(self.source.pointer, self.product_kind);
92+
new_eccodes_handle = codes_handle_new_from_file(self.source.pointer, self.product_kind);
9293
}
9394

94-
match file_handle {
95+
match new_eccodes_handle {
96+
Ok(h) => {
97+
self.eccodes_handle = h;
98+
99+
if self.eccodes_handle.is_null() {
100+
Ok(None)
101+
} else {
102+
let message = get_message_from_handle(h);
103+
Ok(Some(message))
104+
}
105+
}
106+
Err(e) => Err(e),
107+
}
108+
}
109+
}
110+
111+
impl FallibleIterator for CodesHandle<CodesIndex> {
112+
type Item = KeyedMessage;
113+
114+
type Error = CodesError;
115+
116+
fn next(&mut self) -> Result<Option<Self::Item>, Self::Error> {
117+
let new_eccodes_handle;
118+
unsafe {
119+
codes_handle_delete(self.eccodes_handle)?;
120+
new_eccodes_handle = codes_iter_next_from_index(self.source.pointer);
121+
}
122+
123+
match new_eccodes_handle {
95124
Ok(h) => {
96125
self.eccodes_handle = h;
97126

src/codes_handle/mod.rs

-4
Original file line numberDiff line numberDiff line change
@@ -357,10 +357,6 @@ impl SpecialDrop for CodesIndex {
357357
fn spec_drop(&mut self) {
358358
dbg!("CodesIndex drop");
359359

360-
if self.pointer.is_null() {
361-
return;
362-
}
363-
364360
unsafe {
365361
codes_index_delete(self.pointer);
366362
}

src/codes_index/mod.rs

+18-10
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ use crate::{
55
codes_handle::SpecialDrop,
66
errors::CodesError,
77
intermediate_bindings::codes_index::{
8-
codes_index_add_file, codes_index_delete, codes_index_new, codes_index_read,
8+
codes_index_add_file, codes_index_new, codes_index_read,
99
codes_index_select_double, codes_index_select_long, codes_index_select_string,
1010
},
1111
};
1212
use eccodes_sys::codes_index;
13-
use std::{path::Path, ptr::null_mut};
13+
use fs2::FileExt;
14+
use std::{fs::OpenOptions, path::Path};
1415

1516
#[derive(Debug)]
1617
#[cfg_attr(docsrs, doc(cfg(feature = "ec_index")))]
@@ -138,6 +139,7 @@ mod tests {
138139
}
139140

140141
#[test]
142+
#[ignore]
141143
fn add_file() {
142144
let keys = vec!["shortName", "typeOfLevel", "level", "stepType"];
143145
let index = CodesIndex::new_from_keys(&keys).unwrap();
@@ -165,18 +167,24 @@ mod tests {
165167
}
166168

167169
#[test]
168-
fn iterate_handle_from_iter() {
170+
fn iterate_handle_from_index() {
169171
let file_path = Path::new("./data/iceland-surface.idx");
170-
let mut index = CodesIndex::read_from_file(file_path).unwrap();
171-
index.select("shortName", "2t").unwrap();
172-
index.select("typeOfLevel", "surface").unwrap();
173-
index.select("level", 0).unwrap();
174-
index.select("stepType", "instant").unwrap();
175-
let handle = CodesHandle::new_from_index(index, ProductKind::GRIB);
172+
let index = CodesIndex::read_from_file(file_path)
173+
.unwrap()
174+
.select("shortName", "2t")
175+
.unwrap()
176+
.select("typeOfLevel", "surface")
177+
.unwrap()
178+
.select("level", 0)
179+
.unwrap()
180+
.select("stepType", "instant")
181+
.unwrap();
182+
183+
let handle = CodesHandle::new_from_index(index, ProductKind::GRIB).unwrap();
176184

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

179-
println!("Counter: {}", counter);
187+
println!("Counter: {:?}", counter);
180188
}
181189

182190
// {

src/intermediate_bindings/codes_index.rs

+22
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ pub unsafe fn codes_index_read(filename: &str) -> Result<*mut codes_index, Codes
4141
}
4242

4343
pub unsafe fn codes_index_delete(index: *mut codes_index) {
44+
if index.is_null() {
45+
return;
46+
}
47+
4448
eccodes_sys::codes_index_delete(index);
4549
}
4650

@@ -118,3 +122,21 @@ pub unsafe fn codes_handle_new_from_index(
118122
}
119123
Ok(codes_handle)
120124
}
125+
126+
pub unsafe fn codes_iter_next_from_index(
127+
index: *mut codes_index,
128+
) -> Result<*mut codes_handle, CodesError> {
129+
let mut error_code: i32 = 0;
130+
131+
let codes_handle = eccodes_sys::codes_handle_new_from_index(index, &mut error_code);
132+
133+
if error_code == -43 {
134+
return Ok(codes_handle);
135+
}
136+
137+
if error_code != 0 {
138+
let err: CodesInternal = FromPrimitive::from_i32(error_code).unwrap();
139+
return Err(err.into());
140+
}
141+
Ok(codes_handle)
142+
}

src/intermediate_bindings/mod.rs

+4
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ pub unsafe fn codes_handle_new_from_file(
7171
}
7272

7373
pub unsafe fn codes_handle_delete(handle: *mut codes_handle) -> Result<(), CodesError> {
74+
if handle.is_null() {
75+
return Ok(());
76+
}
77+
7478
let error_code = eccodes_sys::codes_handle_delete(handle);
7579

7680
if error_code != 0 {

0 commit comments

Comments
 (0)