From fb7d63f1a9c553ed0b48569db2e646f42684be55 Mon Sep 17 00:00:00 2001 From: Thomas Voss Date: Sat, 5 Nov 2022 00:04:54 +0100 Subject: Begin work on v2.0.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The original release of mmv took filenames as command line arguments, opened them in an editor, and then used the saved changes to rename files. This commit begins work on a new version of mmv where files are provided via the standard input and the command line arguments specify a process to spawn. The spawned process reads command line arguments from the standard input, processes them, and prints new names to the standard output. Those new names represent the new file names. Here are a few example usages, some more useful than others. Reverse file names: $ ls * | mmv rev Edit file names in your editor (v1.0.0 behavior): $ ls * | mmv vipe Number movies so they’re automatically sorted: $ ls movie1 movie2 ... movieN \ | mmv awk '{ printf "%02d-%s\n", NR, $0 }' --- src/error.rs | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) (limited to 'src/error.rs') diff --git a/src/error.rs b/src/error.rs index f303780..7df065d 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,15 +1,18 @@ use std::{ env, fmt::{self, Display}, - io + io, + string }; pub enum Error { + BadArgs, BadLengths, - DuplicateElems(Vec), + DupInputElems(Vec), + DupOutputElems(Vec), IOError(io::Error), - NoArgs, - NoEditor, + Nop, + UTF8Error(string::FromUtf8Error), SpawnFailed(String, io::Error), } @@ -17,13 +20,17 @@ impl Display for Error { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let p = env::args().next().unwrap(); match self { + Self::BadArgs => writeln!(f, "Usage: {p} [-0ei] [--] utility [argument ...]"), Self::BadLengths => writeln!(f, "{p}: Files have been added or removed during editing"), - Self::DuplicateElems(ds) => ds.iter().try_for_each( - |d| writeln!(f, "{p}: Multiple files named \"{}\" specified", d) + Self::DupInputElems(ds) => ds.iter().try_for_each( + |d| writeln!(f, "{p}: Multiple input files named \"{}\" specified", d) + ), + Self::DupOutputElems(ds) => ds.iter().try_for_each( + |d| writeln!(f, "{p}: Multiple output files named \"{}\" specified", d) ), Self::IOError(e) => writeln!(f, "{p}: {e}"), - Self::NoArgs => writeln!(f, "Usage: {p} file ..."), - Self::NoEditor => writeln!(f, "{p}: \"EDITOR\" environment variable is not set"), + Self::Nop => Ok(()), + Self::UTF8Error(e) => writeln!(f, "{p}: {e}"), Self::SpawnFailed(ed, e) => writeln!(f, "{p}: Failed to spawn editor \"{ed}\": {e}") } } @@ -34,3 +41,9 @@ impl From for Error { Self::IOError(e) } } + +impl From for Error { + fn from(e: string::FromUtf8Error) -> Self { + Self::UTF8Error(e) + } +} -- cgit v1.2.3