Skip to content

Commit b3af9c0

Browse files
committed
Remove unsafe block from dynamic key read and make the whole function more idiomatic, thus easier to comprehend
1 parent d1ce0f9 commit b3af9c0

File tree

1 file changed

+21
-81
lines changed

1 file changed

+21
-81
lines changed

src/codes_message/read.rs

Lines changed: 21 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -223,104 +223,44 @@ impl<P: Debug> CodesMessage<P> {
223223
/// bug in the crate or bug in the ecCodes library. If you encounter this error please check
224224
/// if your file is correct and report it on Github.
225225
pub fn read_key_dynamic(&self, key_name: &str) -> Result<DynamicKeyType, CodesError> {
226-
let key_type;
226+
let key_type = self.get_key_native_type(key_name)?;
227+
let key_size = self.get_key_size(key_name)?;
227228

228-
unsafe {
229-
key_type = codes_get_native_type(self.message_handle, key_name)?;
230-
}
231-
232-
let key_value = match key_type {
229+
match key_type {
233230
NativeKeyType::Long => {
234-
let key_size;
235-
unsafe { key_size = codes_get_size(self.message_handle, key_name)? }
236-
237231
if key_size == 1 {
238-
let value;
239-
unsafe {
240-
value = codes_get_long(self.message_handle, key_name);
241-
}
242-
243-
match value {
244-
Ok(val) => Ok(DynamicKeyType::Int(val)),
245-
Err(err) => Err(err),
246-
}
232+
self.read_key_unchecked(key_name)
233+
.map(|v| DynamicKeyType::Int(v))
247234
} else if key_size >= 2 {
248-
let value;
249-
unsafe {
250-
value = codes_get_long_array(self.message_handle, key_name);
251-
}
252-
253-
match value {
254-
Ok(val) => Ok(DynamicKeyType::IntArray(val)),
255-
Err(err) => Err(err),
256-
}
235+
self.read_key_unchecked(key_name)
236+
.map(|v| DynamicKeyType::IntArray(v))
257237
} else {
258238
return Err(CodesError::IncorrectKeySize);
259239
}
260240
}
261241
NativeKeyType::Double => {
262-
let key_size;
263-
unsafe { key_size = codes_get_size(self.message_handle, key_name)? }
264-
265242
if key_size == 1 {
266-
let value;
267-
unsafe {
268-
value = codes_get_double(self.message_handle, key_name);
269-
}
270-
271-
match value {
272-
Ok(val) => Ok(DynamicKeyType::Float(val)),
273-
Err(err) => Err(err),
274-
}
243+
self.read_key_unchecked(key_name)
244+
.map(|v| DynamicKeyType::Float(v))
275245
} else if key_size >= 2 {
276-
let value;
277-
unsafe {
278-
value = codes_get_double_array(self.message_handle, key_name);
279-
}
280-
281-
match value {
282-
Ok(val) => Ok(DynamicKeyType::FloatArray(val)),
283-
Err(err) => Err(err),
284-
}
246+
self.read_key_unchecked(key_name)
247+
.map(|v| DynamicKeyType::FloatArray(v))
285248
} else {
286249
return Err(CodesError::IncorrectKeySize);
287250
}
288251
}
289-
NativeKeyType::Bytes => {
290-
let value;
291-
unsafe {
292-
value = codes_get_bytes(self.message_handle, key_name);
293-
}
294-
295-
match value {
296-
Ok(val) => Ok(DynamicKeyType::Bytes(val)),
297-
Err(err) => Err(err),
298-
}
299-
}
252+
NativeKeyType::Bytes => self
253+
.read_key_unchecked(key_name)
254+
.map(|v| DynamicKeyType::Bytes(v)),
300255
NativeKeyType::Missing => return Err(CodesError::MissingKey),
301-
_ => {
302-
let value;
303-
unsafe {
304-
value = codes_get_string(self.message_handle, key_name);
305-
}
306-
307-
match value {
308-
Ok(val) => Ok(DynamicKeyType::Str(val)),
309-
Err(err) => Err(err),
310-
}
311-
}
312-
};
313-
314-
if let Ok(value) = key_value {
315-
Ok(value)
316-
} else {
317-
let value;
318-
unsafe {
319-
value = codes_get_bytes(self.message_handle, key_name)?;
320-
}
321-
322-
Ok(DynamicKeyType::Bytes(value))
256+
_ => self
257+
.read_key_unchecked(key_name)
258+
.map(|v| DynamicKeyType::Str(v)),
323259
}
260+
.or_else(|_| {
261+
self.read_key_unchecked(key_name)
262+
.map(|v| DynamicKeyType::Bytes(v))
263+
})
324264
}
325265
}
326266

0 commit comments

Comments
 (0)