aboutsummaryrefslogtreecommitdiff
path: root/src/error.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/error.rs')
-rw-r--r--src/error.rs63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/error.rs b/src/error.rs
new file mode 100644
index 0000000..e592e50
--- /dev/null
+++ b/src/error.rs
@@ -0,0 +1,63 @@
+use std::{
+ env,
+ ffi::OsString,
+ fmt::{self, Display, Formatter},
+ io,
+ path::PathBuf,
+};
+
+pub enum Error {
+ BadArgs(Option<lexopt::Error>),
+ BadDecoding(String),
+ BadLengths,
+ DuplicateInput(PathBuf),
+ DuplicateOutput(PathBuf),
+ IO(io::Error),
+ Nop,
+ SpawnFailed(OsString, io::Error),
+}
+
+impl Display for Error {
+ fn fmt(&self, f: &mut Formatter) -> fmt::Result {
+ let p = env::args().next().unwrap();
+ match self {
+ Self::BadArgs(o) => {
+ if let Some(v) = o {
+ writeln!(f, "{p}: {v}")?;
+ }
+ writeln!(f, "Usage: {p} [-0eiv] command [argument ...]")
+ }
+ Self::BadDecoding(s) => writeln!(f, "{p}: Decoding the file “{s}” failed!"),
+ Self::BadLengths => writeln!(f, "{p}: Files have been added or removed during editing"),
+ Self::DuplicateInput(s) => writeln!(
+ f,
+ "{p}: Input file “{}” specified more than once",
+ s.to_string_lossy()
+ ),
+ Self::DuplicateOutput(s) => writeln!(
+ f,
+ "{p}: Output file “{}” specified more than once",
+ s.to_string_lossy()
+ ),
+ Self::IO(e) => writeln!(f, "{p}: {e}"),
+ Self::Nop => Ok(()),
+ Self::SpawnFailed(ed, e) => writeln!(
+ f,
+ "{p}: Failed to spawn utility “{}”: {e}",
+ ed.to_string_lossy()
+ ),
+ }
+ }
+}
+
+impl From<io::Error> for Error {
+ fn from(e: io::Error) -> Self {
+ Self::IO(e)
+ }
+}
+
+impl From<lexopt::Error> for Error {
+ fn from(e: lexopt::Error) -> Self {
+ Self::BadArgs(Some(e))
+ }
+}