From f7ebd87192b42e1157a128233ca672091024cf27 Mon Sep 17 00:00:00 2001 From: Quba1 <22771850+Quba1@users.noreply.github.com> Date: Wed, 10 Dec 2025 17:48:48 +0100 Subject: [PATCH 1/3] fix: use type inference in pointer casting this handles small differences in types generated by bindgen on different targets --- src/codes_handle/mod.rs | 6 +++--- src/intermediate_bindings/codes_get.rs | 10 +++++----- src/intermediate_bindings/codes_handle.rs | 8 +------- src/intermediate_bindings/codes_set.rs | 6 +++--- src/keyed_message/write.rs | 2 +- 5 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/codes_handle/mod.rs b/src/codes_handle/mod.rs index f004f7f..51cc977 100644 --- a/src/codes_handle/mod.rs +++ b/src/codes_handle/mod.rs @@ -8,7 +8,7 @@ use crate::{ }; use eccodes_sys::{codes_handle, ProductKind_PRODUCT_GRIB}; use errno::errno; -use libc::{c_char, c_void, size_t, FILE}; +use libc::{c_void, size_t, FILE}; use std::{ fmt::Debug, fs::{File, OpenOptions}, @@ -294,7 +294,7 @@ impl CodesHandle { } fn open_with_fdopen(file: &File) -> Result<*mut FILE, CodesError> { - let file_ptr = unsafe { libc::fdopen(file.as_raw_fd(), "r".as_ptr().cast::()) }; + let file_ptr = unsafe { libc::fdopen(file.as_raw_fd(), "r".as_ptr().cast::<_>()) }; if file_ptr.is_null() { let error_val = errno(); @@ -314,7 +314,7 @@ fn open_with_fmemopen(file_data: &[u8]) -> Result<*mut FILE, CodesError> { file_ptr = libc::fmemopen( file_data_ptr, file_data.len() as size_t, - "r".as_ptr().cast::(), + "r".as_ptr().cast::<_>(), ); } diff --git a/src/intermediate_bindings/codes_get.rs b/src/intermediate_bindings/codes_get.rs index 57dbcfb..71b80c4 100644 --- a/src/intermediate_bindings/codes_get.rs +++ b/src/intermediate_bindings/codes_get.rs @@ -95,7 +95,7 @@ pub unsafe fn codes_get_double_array( let error_code = eccodes_sys::codes_get_double_array( handle, key.as_ptr(), - key_values.as_mut_ptr().cast::(), + key_values.as_mut_ptr().cast::<_>(), &mut key_size, ); @@ -121,7 +121,7 @@ pub unsafe fn codes_get_long_array( let error_code = eccodes_sys::codes_get_long_array( handle, key.as_ptr(), - key_values.as_mut_ptr().cast::(), + key_values.as_mut_ptr().cast::<_>(), &mut key_size, ); @@ -166,7 +166,7 @@ pub unsafe fn codes_get_string( let error_code = eccodes_sys::codes_get_string( handle, key.as_ptr(), - key_message.as_mut_ptr().cast::(), + key_message.as_mut_ptr().cast::<_>(), &mut key_length, ); @@ -204,7 +204,7 @@ pub unsafe fn codes_get_bytes( let error_code = eccodes_sys::codes_get_bytes( handle, key.as_ptr(), - buffer.as_mut_ptr().cast::(), + buffer.as_mut_ptr().cast::<_>(), &mut key_size, ); @@ -239,7 +239,7 @@ pub unsafe fn codes_get_message( let buffer_size = codes_get_message_size(handle)?; let buffer: Vec = vec![0; buffer_size]; - let mut buffer_ptr = buffer.as_ptr().cast::(); + let mut buffer_ptr = buffer.as_ptr().cast::<_>(); let mut message_size: usize = 0; diff --git a/src/intermediate_bindings/codes_handle.rs b/src/intermediate_bindings/codes_handle.rs index 581bf7b..7fe599a 100644 --- a/src/intermediate_bindings/codes_handle.rs +++ b/src/intermediate_bindings/codes_handle.rs @@ -15,12 +15,6 @@ use crate::{ pointer_guard, }; -#[cfg(target_os = "macos")] -type _SYS_IO_FILE = eccodes_sys::__sFILE; - -#[cfg(not(target_os = "macos"))] -type _SYS_IO_FILE = eccodes_sys::_IO_FILE; - pub unsafe fn codes_handle_new_from_file( file_pointer: *mut FILE, product_kind: ProductKind, @@ -33,7 +27,7 @@ pub unsafe fn codes_handle_new_from_file( let file_handle = eccodes_sys::codes_handle_new_from_file( context, - file_pointer.cast::<_SYS_IO_FILE>(), + file_pointer.cast::<_>(), product_kind as u32, &mut error_code, ); diff --git a/src/intermediate_bindings/codes_set.rs b/src/intermediate_bindings/codes_set.rs index 51015cb..23cde81 100644 --- a/src/intermediate_bindings/codes_set.rs +++ b/src/intermediate_bindings/codes_set.rs @@ -64,7 +64,7 @@ pub unsafe fn codes_set_long_array( let error_code = eccodes_sys::codes_set_long_array( handle, key.as_ptr(), - values.as_ptr().cast::(), + values.as_ptr().cast::<_>(), length, ); @@ -90,7 +90,7 @@ pub unsafe fn codes_set_double_array( let error_code = eccodes_sys::codes_set_double_array( handle, key.as_ptr(), - values.as_ptr().cast::(), + values.as_ptr().cast::<_>(), length, ); @@ -138,7 +138,7 @@ pub unsafe fn codes_set_bytes( let error_code = eccodes_sys::codes_set_bytes( handle, key.as_ptr(), - values.as_ptr().cast::(), + values.as_ptr().cast::<_>(), &mut length, ); diff --git a/src/keyed_message/write.rs b/src/keyed_message/write.rs index c91282b..31cffba 100644 --- a/src/keyed_message/write.rs +++ b/src/keyed_message/write.rs @@ -116,7 +116,7 @@ impl KeyedMessage { append: bool, ) -> Result<(), CodesError> { let msg = unsafe { codes_get_message(self.message_handle)? }; - let buf = unsafe { slice::from_raw_parts(msg.0.cast::(), msg.1) }; + let buf = unsafe { slice::from_raw_parts(msg.0.cast::<_>(), msg.1) }; let mut file = OpenOptions::new() .write(true) .create(true) From 6808a07178421614a9ac6ff5109922f2c8e3a5ff Mon Sep 17 00:00:00 2001 From: Quba1 <22771850+Quba1@users.noreply.github.com> Date: Wed, 10 Dec 2025 17:53:45 +0100 Subject: [PATCH 2/3] clippy: automatic fixes --- src/codes_nearest.rs | 2 +- src/intermediate_bindings/codes_get.rs | 22 +++++++++++----------- src/intermediate_bindings/codes_handle.rs | 4 ++-- src/intermediate_bindings/codes_index.rs | 4 ++-- src/intermediate_bindings/codes_set.rs | 4 ++-- src/intermediate_bindings/grib_nearest.rs | 4 ++-- src/keys_iterator.rs | 2 +- 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/codes_nearest.rs b/src/codes_nearest.rs index c366ccf..ef083f3 100644 --- a/src/codes_nearest.rs +++ b/src/codes_nearest.rs @@ -45,7 +45,7 @@ impl KeyedMessage { /// /// This function returns [`CodesInternal`](crate::errors::CodesInternal) when /// internal nearest handle cannot be created. - pub fn codes_nearest<'a>(&'a self) -> Result, CodesError> { + pub fn codes_nearest(&self) -> Result, CodesError> { let nearest_handle = unsafe { codes_grib_nearest_new(self.message_handle)? }; Ok(CodesNearest { diff --git a/src/intermediate_bindings/codes_get.rs b/src/intermediate_bindings/codes_get.rs index 71b80c4..dc71054 100644 --- a/src/intermediate_bindings/codes_get.rs +++ b/src/intermediate_bindings/codes_get.rs @@ -23,7 +23,7 @@ pub unsafe fn codes_get_native_type( let key = CString::new(key).unwrap(); let mut key_type: i32 = 0; - let error_code = eccodes_sys::codes_get_native_type(handle, key.as_ptr(), &mut key_type); + let error_code = eccodes_sys::codes_get_native_type(handle, key.as_ptr(), &raw mut key_type); if error_code != 0 { let err: CodesInternal = FromPrimitive::from_i32(error_code).unwrap(); @@ -39,7 +39,7 @@ pub unsafe fn codes_get_size(handle: *const codes_handle, key: &str) -> Result Result Result let key = CString::new(key).unwrap(); let mut key_value: f64 = 0.0; - let error_code = eccodes_sys::codes_get_double(handle, key.as_ptr(), &mut key_value); + let error_code = eccodes_sys::codes_get_double(handle, key.as_ptr(), &raw mut key_value); if error_code != 0 { let err: CodesInternal = FromPrimitive::from_i32(error_code).unwrap(); @@ -96,7 +96,7 @@ pub unsafe fn codes_get_double_array( handle, key.as_ptr(), key_values.as_mut_ptr().cast::<_>(), - &mut key_size, + &raw mut key_size, ); if error_code != 0 { @@ -122,7 +122,7 @@ pub unsafe fn codes_get_long_array( handle, key.as_ptr(), key_values.as_mut_ptr().cast::<_>(), - &mut key_size, + &raw mut key_size, ); if error_code != 0 { @@ -142,7 +142,7 @@ pub unsafe fn codes_get_length( let key = CString::new(key).unwrap(); let mut key_length: usize = 0; - let error_code = eccodes_sys::codes_get_length(handle, key.as_ptr(), &mut key_length); + let error_code = eccodes_sys::codes_get_length(handle, key.as_ptr(), &raw mut key_length); if error_code != 0 { let err: CodesInternal = FromPrimitive::from_i32(error_code).unwrap(); @@ -167,7 +167,7 @@ pub unsafe fn codes_get_string( handle, key.as_ptr(), key_message.as_mut_ptr().cast::<_>(), - &mut key_length, + &raw mut key_length, ); if error_code != 0 { @@ -205,7 +205,7 @@ pub unsafe fn codes_get_bytes( handle, key.as_ptr(), buffer.as_mut_ptr().cast::<_>(), - &mut key_size, + &raw mut key_size, ); if error_code != 0 { @@ -221,7 +221,7 @@ pub unsafe fn codes_get_message_size(handle: *const codes_handle) -> Result(), product_kind as u32, - &mut error_code, + &raw mut error_code, ); if error_code != 0 { @@ -67,7 +67,7 @@ pub unsafe fn codes_handle_new_from_index( let mut error_code: i32 = 0; let _g = CODES_LOCK.lock().unwrap(); - let codes_handle = eccodes_sys::codes_handle_new_from_index(index, &mut error_code); + let codes_handle = eccodes_sys::codes_handle_new_from_index(index, &raw mut error_code); // special case! codes_handle_new_from_index returns -43 when there are no messages left in the index // this is also indicated by a null pointer, which is handled upstream diff --git a/src/intermediate_bindings/codes_index.rs b/src/intermediate_bindings/codes_index.rs index f895557..097b7e9 100644 --- a/src/intermediate_bindings/codes_index.rs +++ b/src/intermediate_bindings/codes_index.rs @@ -19,7 +19,7 @@ pub unsafe fn codes_index_new(keys: &str) -> Result<*mut codes_index, CodesError let keys = CString::new(keys).unwrap(); let _g = CODES_LOCK.lock().unwrap(); - let codes_index = eccodes_sys::codes_index_new(context, keys.as_ptr(), &mut error_code); + let codes_index = eccodes_sys::codes_index_new(context, keys.as_ptr(), &raw mut error_code); if error_code != 0 { let err: CodesInternal = FromPrimitive::from_i32(error_code).unwrap(); @@ -34,7 +34,7 @@ pub unsafe fn codes_index_read(filename: &str) -> Result<*mut codes_index, Codes let mut error_code: i32 = 0; let _g = CODES_LOCK.lock().unwrap(); - let codes_index = eccodes_sys::codes_index_read(context, filename.as_ptr(), &mut error_code); + let codes_index = eccodes_sys::codes_index_read(context, filename.as_ptr(), &raw mut error_code); if error_code != 0 { let err: CodesInternal = FromPrimitive::from_i32(error_code).unwrap(); diff --git a/src/intermediate_bindings/codes_set.rs b/src/intermediate_bindings/codes_set.rs index 23cde81..0ff0cce 100644 --- a/src/intermediate_bindings/codes_set.rs +++ b/src/intermediate_bindings/codes_set.rs @@ -114,7 +114,7 @@ pub unsafe fn codes_set_string( let value = CString::new(value).unwrap(); let error_code = - eccodes_sys::codes_set_string(handle, key.as_ptr(), value.as_ptr(), &mut length); + eccodes_sys::codes_set_string(handle, key.as_ptr(), value.as_ptr(), &raw mut length); if error_code != 0 { let err: CodesInternal = FromPrimitive::from_i32(error_code).unwrap(); @@ -139,7 +139,7 @@ pub unsafe fn codes_set_bytes( handle, key.as_ptr(), values.as_ptr().cast::<_>(), - &mut length, + &raw mut length, ); if error_code != 0 { diff --git a/src/intermediate_bindings/grib_nearest.rs b/src/intermediate_bindings/grib_nearest.rs index e6b604a..129cb83 100644 --- a/src/intermediate_bindings/grib_nearest.rs +++ b/src/intermediate_bindings/grib_nearest.rs @@ -19,7 +19,7 @@ pub unsafe fn codes_grib_nearest_new( let mut error_code: i32 = 0; - let nearest = eccodes_sys::codes_grib_nearest_new(handle, &mut error_code); + let nearest = eccodes_sys::codes_grib_nearest_new(handle, &raw mut error_code); if error_code != 0 { let err: CodesInternal = FromPrimitive::from_i32(error_code).unwrap(); @@ -79,7 +79,7 @@ pub unsafe fn codes_grib_nearest_find( addr_of_mut!(output_values[0]), addr_of_mut!(output_distances[0]), addr_of_mut!(output_indexes[0]), - &mut length, + &raw mut length, ); if error_code != 0 { diff --git a/src/keys_iterator.rs b/src/keys_iterator.rs index 930b08e..51ca4a8 100644 --- a/src/keys_iterator.rs +++ b/src/keys_iterator.rs @@ -160,7 +160,7 @@ impl KeyedMessage { /// /// This function returns [`CodesInternal`](crate::errors::CodesInternal) when /// internal ecCodes function returns non-zero code. - pub fn default_keys_iterator<'a>(&'a self) -> Result, CodesError> { + pub fn default_keys_iterator(&self) -> Result, CodesError> { let iterator_handle = unsafe { codes_keys_iterator_new(self.message_handle, 0, "")? }; let next_item_exists = unsafe { codes_keys_iterator_next(iterator_handle)? }; From f0b4244c10db4a6b3e9c31f3f37f24404dee27c5 Mon Sep 17 00:00:00 2001 From: Quba1 <22771850+Quba1@users.noreply.github.com> Date: Wed, 10 Dec 2025 17:54:46 +0100 Subject: [PATCH 3/3] bump minor version --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index ee7b32e..8237d92 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ name = "eccodes" description = "Unofficial high-level Rust bindings of the latest ecCodes release" repository = "https://github.com/ScaleWeather/eccodes" -version = "0.13.2" +version = "0.13.3" readme = "README.md" authors = ["Jakub Lewandowski "] keywords = ["eccodes", "grib", "bufr", "meteorology", "weather"]