From 18436aaaa312ec4413c52c10040648d1394d9f57 Mon Sep 17 00:00:00 2001 From: Josh Mitchell Date: Sat, 7 Nov 2020 23:45:14 +1100 Subject: [PATCH] Nicer error messages --- src/errors.rs | 46 ++++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/src/errors.rs b/src/errors.rs index 3e2eec3..0731bb3 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -86,41 +86,47 @@ impl From for Error { impl std::fmt::Display for Error { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { use ErrorTask::*; - match &self.task { - OpenFile(path, mode) => write!( + match (&self.task, &self.code) { + (OpenFile(path, mode), _) => write!( f, "Failed to open file at {path:?} with mode {mode:?}", path = path, mode = mode ), - ReadNumAtoms => write!( + (ReadNumAtoms, Some(code)) => write!( f, - "Failed to read atom number from trajectory: C API returned error code {:?}", - self.code + "Failed to read atom number from trajectory: C API returned error code {}", + code ), - Read => write!( + (ReadNumAtoms, None) => write!(f, "Failed to read atom number from trajectory"), + (Read, Some(code)) => write!( f, - "Failed to read trajectory: C API returned error code {:?}", - self.code + "Failed to read trajectory: C API returned error code {}", + code ), - Write => write!( + (Read, None) => write!(f, "Failed to read trajectory"), + (Write, Some(code)) => write!( f, - "Failed to write trajectory: C API returned error code {:?}", - self.code + "Failed to write trajectory: C API returned error code {}", + code ), - Flush => write!( + (Write, None) => write!(f, "Failed to write trajectory"), + (Flush, Some(code)) => write!( f, - "Failed to flush trajectory: C API returned error code {:?}", - self.code + "Failed to flush trajectory: C API returned error code {}", + code ), - ToCString(_) => write!( + (ToCString(_), _) => write!( f, "Path cannot be converted to a C string because it has a null byte" ), + (Flush, None) => write!(f, "Failed to flush trajectory"), } } } +impl std::error::Error for Error {} + #[derive(Debug, Clone, PartialEq)] pub enum ErrorCode { ExdrOk, @@ -171,7 +177,15 @@ impl From for ErrorCode { } } -impl std::error::Error for Error {} +impl std::fmt::Display for ErrorCode { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + if let Self::UnmatchedCode(i) = self { + write!(f, "{}", i) + } else { + write!(f, "{:?}", self) + } + } +} pub type Result = std::result::Result;