diff --git a/src/errors.rs b/src/errors.rs index c9d3982..a78dd2d 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -2,6 +2,7 @@ use crate::c_abi; use crate::FileMode; use crate::Frame; use std::error::Error as StdError; +use std::os::raw::c_int; use std::path::{Path, PathBuf}; /// Error type for the xdrfile library @@ -35,6 +36,8 @@ pub enum Error { task: ErrorTask, value: usize, }, + /// A numeric cast from `value` failed during `task` + NumAtomsOutOfRange(c_int), } impl Error { @@ -134,10 +137,12 @@ impl std::fmt::Display for Error { CouldNotCheckNAtoms(_err) => { write!(f, "Failed to read number of atoms in trajectory file") } - StepSizeOutOfRange(n) => write!(f, "Step {} does not fit in usize on this platform", n), + StepSizeOutOfRange(n) | NumAtomsOutOfRange(n) => { + write!(f, "Step {} does not fit in usize on this platform", n) + } CastToCintFailed { value, task, .. } => write!( f, - "Numeric cast from {value}:usize to i32 failed while {task}", + "Numeric cast from {value}:usize to C int failed while {task}", value = value, task = task ), diff --git a/src/lib.rs b/src/lib.rs index 2bc12da..a1f35a6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -327,8 +327,7 @@ impl Trajectory for XTCTrajectory { if let Some(err) = check_code(code, ErrorTask::ReadNumAtoms) { Err(err) } else { - Ok(usize::try_from(num_atoms) - .expect("Number of atoms in file does not fit in usize")) + usize::try_from(num_atoms).map_err(|_| Error::NumAtomsOutOfRange(num_atoms)) } } }) @@ -458,8 +457,7 @@ impl Trajectory for TRRTrajectory { if let Some(err) = check_code(code, ErrorTask::ReadNumAtoms) { Err(err) } else { - Ok(usize::try_from(num_atoms) - .expect("Number of atoms in file does not fit in usize")) + usize::try_from(num_atoms).map_err(|_| Error::NumAtomsOutOfRange(num_atoms)) } } })