use std::fmt;
use std::io::{self, Write, stderr, stdout};
use std::path::PathBuf;
use std::process::exit;
#[derive(Debug)]
pub enum FileErr {
Open(PathBuf, io::Error),
Read(PathBuf, io::Error),
Write(PathBuf, io::Error),
}
impl fmt::Display for FileErr {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
FileErr::Open(ref path, ref io) => write!(f, "unable to open {:?}: {}", path, io),
FileErr::Read(ref path, ref io) => write!(f, "unable to read {:?}: {}", path, io),
FileErr::Write(ref path, ref io) => write!(f, "unable to write {:?}: {}", path, io)
}
}
}
#[derive(Debug)]
pub enum ParseErr {
DelayNaN(usize),
DelayNoValue,
File(FileErr),
JoblogNoValue,
JobsNaN(String),
JobsNoValue,
InvalidArgument(usize),
MaxArgsNaN(usize),
MaxArgsNoValue,
MemInvalid(usize),
MemNoValue,
NoArguments,
NonTerminated(String),
RedirFile(PathBuf),
TimeoutNaN(usize),
TimeoutNoValue,
WorkDirNoValue,
}
impl From<FileErr> for ParseErr {
fn from(input: FileErr) -> ParseErr { ParseErr::File(input) }
}
impl ParseErr {
pub fn handle(self, arguments: &[String]) -> ! {
let stderr = stderr();
let stdout = stdout();
let mut stderr = stderr.lock();
let stdout = &mut stdout.lock();
let _ = stderr.write(b"parallel: parsing error: ");
match self {
ParseErr::File(file_err) => {
let _ = writeln!(stderr, "{}", file_err);
}
ParseErr::DelayNaN(index) => {
let _ = write!(stderr, "delay parameter, '{}', is not a number.\n", arguments[index]);
},
ParseErr::DelayNoValue => {
let _ = stderr.write(b"no delay parameter was defined.\n");
},
ParseErr::JoblogNoValue => {
let _ = stderr.write(b"no joblog parameter was defined.\n");
},
ParseErr::JobsNaN(value) => {
let _ = write!(stderr, "jobs parameter, '{}', is not a number.\n", value);
},
ParseErr::JobsNoValue => {
let _ = stderr.write(b"no jobs parameter was defined.\n");
},
ParseErr::MaxArgsNaN(index) => {
let _ = write!(stderr, "groups parameter, '{}', is not a number.\n", arguments[index]);
},
ParseErr::MaxArgsNoValue => {
let _ = stderr.write(b"no groups parameter was defined.\n");
},
ParseErr::MemNoValue => {
let _ = stderr.write(b"no memory parameter was defined.\n");
},
ParseErr::MemInvalid(index) => {
let _ = write!(stderr, "invalid memory value: {}\n", arguments[index]);
}
ParseErr::InvalidArgument(index) => {
let _ = write!(stderr, "invalid argument: {}\n", arguments[index]);
},
ParseErr::NoArguments => {
let _ = write!(stderr, "no input arguments were given.\n");
},
ParseErr::NonTerminated(command) => {
let _ = write!(stderr, "command is not properly terminated:\n $ {}\nTip: Try using the --quote parameter to escape your command\n", command);
},
ParseErr::RedirFile(path) => {
let _ = write!(stderr, "an error occurred while redirecting file: {:?}\n", path);
},
ParseErr::TimeoutNaN(index) => {
let _ = write!(stderr, "invalid timeout value: {}\n", arguments[index]);
},
ParseErr::TimeoutNoValue => {
let _ = stderr.write(b"no timeout parameter was defined.\n");
},
ParseErr::WorkDirNoValue => {
let _ = stderr.write(b"no workdir parameter was defined.\n");
}
};
let _ = stdout.write(b"For help on command-line usage, execute `parallel -h`\n");
exit(1);
}
}