Add description strings for some errors

This commit is contained in:
Matteo Cypriani 2016-12-07 23:20:45 -05:00
parent 2bf7a1db2d
commit 5a6feec1d6
4 changed files with 32 additions and 28 deletions

View File

@ -51,14 +51,16 @@ pub fn write_cue_sheet(img_path: &String, metadata: &NrgMetadata)
let img_name = PathBuf::from(img_path); let img_name = PathBuf::from(img_path);
let img_name = match img_name.file_name() { let img_name = match img_name.file_name() {
Some(name) => name, Some(name) => name,
None => return Err(NrgError::FileName), None => return Err(NrgError::FileName(img_path.clone())),
}; };
// Set the cue sheet file's name // Set the cue sheet file's name
let mut cue_name = PathBuf::from(img_name); let mut cue_name = PathBuf::from(img_name);
if cue_name.extension().unwrap_or(OsStr::new("")) == "cue" { if cue_name.extension().unwrap_or(OsStr::new("")) == "cue" {
// img_path's extension was already .cue: problem! // 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"); cue_name.set_extension("cue");

View File

@ -32,11 +32,10 @@ use std::io;
pub enum NrgError { pub enum NrgError {
Io(io::Error), Io(io::Error),
String(ffi::IntoStringError), String(ffi::IntoStringError),
NrgFormat, NrgFormat(String),
NrgFormatV1, NrgChunkId(String),
NrgChunkId,
NoNrgCue, NoNrgCue,
FileName, FileName(String),
AudioReadError, AudioReadError,
AudioWriteError, AudioWriteError,
} }
@ -46,13 +45,15 @@ impl fmt::Display for NrgError {
match *self { match *self {
NrgError::Io(ref err) => err.fmt(f), NrgError::Io(ref err) => err.fmt(f),
NrgError::String(ref err) => err.fmt(f), NrgError::String(ref err) => err.fmt(f),
NrgError::NrgFormat => write!(f, "NRG format unknown."), NrgError::NrgFormat(ref err) =>
NrgError::NrgFormatV1 => write!(f, "NRG v1 format is not handled."), write!(f, "NRG format error: {}", err),
NrgError::NrgChunkId => write!(f, "NRG chunk ID unknown."), NrgError::NrgChunkId(ref err) =>
NrgError::NoNrgCue => write!(f, "NRG cue sheet chunk absent."), write!(f, "NRG chunk ID unknown: {}", err),
NrgError::FileName => write!(f, "Invalid file name."), NrgError::NoNrgCue => write!(f, "NRG cue sheet chunk absent"),
NrgError::AudioReadError => write!(f, "Error reading raw audio."), NrgError::FileName(ref err) =>
NrgError::AudioWriteError => write!(f, "Error writing raw audio."), 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 { match *self {
NrgError::Io(ref err) => err.description(), NrgError::Io(ref err) => err.description(),
NrgError::String(ref err) => err.description(), NrgError::String(ref err) => err.description(),
NrgError::NrgFormat => "NRG format", NrgError::NrgFormat(_) => "NRG format",
NrgError::NrgFormatV1 => "NRG format v1", NrgError::NrgChunkId(_) => "NRG chunk ID",
NrgError::NrgChunkId => "NRG chunk ID",
NrgError::NoNrgCue => "No NRG cue", NrgError::NoNrgCue => "No NRG cue",
NrgError::FileName => "File name", NrgError::FileName(_) => "File name",
NrgError::AudioReadError => "Audio read error", NrgError::AudioReadError => "Audio read error",
NrgError::AudioWriteError => "Audio write error", NrgError::AudioWriteError => "Audio write error",
} }
@ -76,11 +76,10 @@ impl Error for NrgError {
match *self { match *self {
NrgError::Io(ref err) => Some(err), NrgError::Io(ref err) => Some(err),
NrgError::String(ref err) => Some(err), NrgError::String(ref err) => Some(err),
NrgError::NrgFormat => None, NrgError::NrgFormat(_) => None,
NrgError::NrgFormatV1 => None, NrgError::NrgChunkId(_) => None,
NrgError::NrgChunkId => None,
NrgError::NoNrgCue => None, NrgError::NoNrgCue => None,
NrgError::FileName => None, NrgError::FileName(_) => None,
NrgError::AudioReadError => None, NrgError::AudioReadError => None,
NrgError::AudioWriteError => None, NrgError::AudioWriteError => None,
} }

View File

@ -56,7 +56,8 @@ pub fn read_nrg_metadata(fd: &mut File) -> Result<NrgMetadata, NrgError> {
nm.nrg_version = try!(read_nrg_version(fd, nm.file_size)); nm.nrg_version = try!(read_nrg_version(fd, nm.file_size));
if nm.nrg_version != 2 { if nm.nrg_version != 2 {
// We handle only NRG v2 // 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 // Read the first chunk offset
@ -78,7 +79,8 @@ pub fn read_nrg_metadata(fd: &mut File) -> Result<NrgMetadata, NrgError> {
fn read_nrg_version(fd: &mut File, file_size: u64) -> Result<u8, NrgError> { fn read_nrg_version(fd: &mut File, file_size: u64) -> Result<u8, NrgError> {
if file_size < 12 { if file_size < 12 {
// Input file too small // 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 // 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<u8, NrgError> {
return Ok(1); // NRG v1 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)); try!(skip_chunk(fd));
nm.skipped_chunks.push(chunk_id); nm.skipped_chunks.push(chunk_id);
}, },
_ => { println!("{}", chunk_id); return Err(NrgError::NrgChunkId); }, //fixme _ => return Err(NrgError::NrgChunkId(chunk_id)),
} }
} }
Ok(()) Ok(())

View File

@ -96,12 +96,13 @@ pub fn extract_nrg_raw_audio(in_fd: &mut File,
fn make_output_file_name(img_path: &String) -> Result<String, NrgError> { fn make_output_file_name(img_path: &String) -> Result<String, NrgError> {
let mut name = PathBuf::from(img_path); let mut name = PathBuf::from(img_path);
name.set_extension("raw"); name.set_extension("raw");
let name = PathBuf::from(name); let name = try!(name.file_name().ok_or(
let name = try!(name.file_name().ok_or(NrgError::FileName)); NrgError::FileName(name.to_string_lossy().into_owned())));
// Make sure the new name and the original name are different // Make sure the new name and the original name are different
if name == img_path.as_str() { 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()) Ok(name.to_string_lossy().into_owned())