diff --git a/src/cue_sheet.rs b/src/cue_sheet.rs index 5c0ec7f..430a762 100644 --- a/src/cue_sheet.rs +++ b/src/cue_sheet.rs @@ -51,14 +51,16 @@ pub fn write_cue_sheet(img_path: &String, metadata: &NrgMetadata) let img_name = PathBuf::from(img_path); let img_name = match img_name.file_name() { Some(name) => name, - None => return Err(NrgError::FileName), + None => return Err(NrgError::FileName(img_path.clone())), }; // Set the cue sheet file's name let mut cue_name = PathBuf::from(img_name); if cue_name.extension().unwrap_or(OsStr::new("")) == "cue" { // img_path's extension was already .cue: problem! - return Err(NrgError::FileName); + return Err(NrgError::FileName("Input and output file are identical" + .to_string())); + } cue_name.set_extension("cue"); diff --git a/src/error.rs b/src/error.rs index c6360b2..5f45f3b 100644 --- a/src/error.rs +++ b/src/error.rs @@ -32,11 +32,10 @@ use std::io; pub enum NrgError { Io(io::Error), String(ffi::IntoStringError), - NrgFormat, - NrgFormatV1, - NrgChunkId, + NrgFormat(String), + NrgChunkId(String), NoNrgCue, - FileName, + FileName(String), AudioReadError, AudioWriteError, } @@ -46,13 +45,15 @@ impl fmt::Display for NrgError { match *self { NrgError::Io(ref err) => err.fmt(f), NrgError::String(ref err) => err.fmt(f), - NrgError::NrgFormat => write!(f, "NRG format unknown."), - NrgError::NrgFormatV1 => write!(f, "NRG v1 format is not handled."), - NrgError::NrgChunkId => write!(f, "NRG chunk ID unknown."), - NrgError::NoNrgCue => write!(f, "NRG cue sheet chunk absent."), - NrgError::FileName => write!(f, "Invalid file name."), - NrgError::AudioReadError => write!(f, "Error reading raw audio."), - NrgError::AudioWriteError => write!(f, "Error writing raw audio."), + NrgError::NrgFormat(ref err) => + write!(f, "NRG format error: {}", err), + NrgError::NrgChunkId(ref err) => + write!(f, "NRG chunk ID unknown: {}", err), + NrgError::NoNrgCue => write!(f, "NRG cue sheet chunk absent"), + NrgError::FileName(ref err) => + write!(f, "Invalid file name: {}", err), + NrgError::AudioReadError => write!(f, "Error reading raw audio"), + NrgError::AudioWriteError => write!(f, "Error writing raw audio"), } } } @@ -62,11 +63,10 @@ impl Error for NrgError { match *self { NrgError::Io(ref err) => err.description(), NrgError::String(ref err) => err.description(), - NrgError::NrgFormat => "NRG format", - NrgError::NrgFormatV1 => "NRG format v1", - NrgError::NrgChunkId => "NRG chunk ID", + NrgError::NrgFormat(_) => "NRG format", + NrgError::NrgChunkId(_) => "NRG chunk ID", NrgError::NoNrgCue => "No NRG cue", - NrgError::FileName => "File name", + NrgError::FileName(_) => "File name", NrgError::AudioReadError => "Audio read error", NrgError::AudioWriteError => "Audio write error", } @@ -76,11 +76,10 @@ impl Error for NrgError { match *self { NrgError::Io(ref err) => Some(err), NrgError::String(ref err) => Some(err), - NrgError::NrgFormat => None, - NrgError::NrgFormatV1 => None, - NrgError::NrgChunkId => None, + NrgError::NrgFormat(_) => None, + NrgError::NrgChunkId(_) => None, NrgError::NoNrgCue => None, - NrgError::FileName => None, + NrgError::FileName(_) => None, NrgError::AudioReadError => None, NrgError::AudioWriteError => None, } diff --git a/src/metadata/mod.rs b/src/metadata/mod.rs index 1791b56..3a10381 100644 --- a/src/metadata/mod.rs +++ b/src/metadata/mod.rs @@ -56,7 +56,8 @@ pub fn read_nrg_metadata(fd: &mut File) -> Result { nm.nrg_version = try!(read_nrg_version(fd, nm.file_size)); if nm.nrg_version != 2 { // We handle only NRG v2 - return Err(NrgError::NrgFormatV1); + return Err(NrgError::NrgFormat( + "NRG v1 format is not handled".to_string())); } // Read the first chunk offset @@ -78,7 +79,8 @@ pub fn read_nrg_metadata(fd: &mut File) -> Result { fn read_nrg_version(fd: &mut File, file_size: u64) -> Result { if file_size < 12 { // Input file too small - return Err(NrgError::NrgFormat); + return Err(NrgError::NrgFormat( + "Input file is to small to be an NRG image".to_string())); } // In NRG v2, the main footer is on the last 12 bytes @@ -95,7 +97,7 @@ fn read_nrg_version(fd: &mut File, file_size: u64) -> Result { return Ok(1); // NRG v1 } - Err(NrgError::NrgFormat) // Unknown format + Err(NrgError::NrgFormat("Unknown format".to_string())) } @@ -131,7 +133,7 @@ fn read_nrg_chunks(fd: &mut File, nm: &mut NrgMetadata) -> Result<(), NrgError> try!(skip_chunk(fd)); nm.skipped_chunks.push(chunk_id); }, - _ => { println!("{}", chunk_id); return Err(NrgError::NrgChunkId); }, //fixme + _ => return Err(NrgError::NrgChunkId(chunk_id)), } } Ok(()) diff --git a/src/raw_audio.rs b/src/raw_audio.rs index 709df65..a8b86c9 100644 --- a/src/raw_audio.rs +++ b/src/raw_audio.rs @@ -96,12 +96,13 @@ pub fn extract_nrg_raw_audio(in_fd: &mut File, fn make_output_file_name(img_path: &String) -> Result { let mut name = PathBuf::from(img_path); name.set_extension("raw"); - let name = PathBuf::from(name); - let name = try!(name.file_name().ok_or(NrgError::FileName)); + let name = try!(name.file_name().ok_or( + NrgError::FileName(name.to_string_lossy().into_owned()))); // Make sure the new name and the original name are different if name == img_path.as_str() { - return Err(NrgError::FileName); + return Err(NrgError::FileName("Input and output file are identical" + .to_string())); } Ok(name.to_string_lossy().into_owned())