@@ -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