Change FinalError builder pattern to take and give ownership of self

This means that when you do `let e = FinalError::with_title("Foo").detail("Blah");`, `e` will be of type `FinalError` instead of `&mut FinalError`, thus you don't have to call `clone()` on it
This commit is contained in:
Spyros Roum 2021-10-15 14:20:49 +03:00
parent c89c34a91f
commit d852a5897c
2 changed files with 13 additions and 34 deletions

View File

@ -50,8 +50,7 @@ pub fn run(command: Command, flags: &oof::Flags) -> crate::Result<()> {
.hint("") .hint("")
.hint("Examples:") .hint("Examples:")
.hint(format!(" ouch compress ... {}.tar.gz", to_utf(&output_path))) .hint(format!(" ouch compress ... {}.tar.gz", to_utf(&output_path)))
.hint(format!(" ouch compress ... {}.zip", to_utf(&output_path))) .hint(format!(" ouch compress ... {}.zip", to_utf(&output_path)));
.clone();
return Err(Error::with_reason(reason)); return Err(Error::with_reason(reason));
} }
@ -79,8 +78,7 @@ pub fn run(command: Command, flags: &oof::Flags) -> crate::Result<()> {
.detail("The only supported formats that archive files into an archive are .tar and .zip.") .detail("The only supported formats that archive files into an archive are .tar and .zip.")
.hint(format!("Try inserting '.tar' or '.zip' before '{}'.", &formats[0])) .hint(format!("Try inserting '.tar' or '.zip' before '{}'.", &formats[0]))
.hint(format!("From: {}", output_path)) .hint(format!("From: {}", output_path))
.hint(format!(" To : {}", suggested_output_path)) .hint(format!(" To : {}", suggested_output_path));
.clone();
return Err(Error::with_reason(reason)); return Err(Error::with_reason(reason));
} }
@ -90,8 +88,7 @@ pub fn run(command: Command, flags: &oof::Flags) -> crate::Result<()> {
.detail(format!("Found the format '{}' in an incorrect position.", format)) .detail(format!("Found the format '{}' in an incorrect position.", format))
.detail(format!("'{}' can only be used at the start of the file extension.", format)) .detail(format!("'{}' can only be used at the start of the file extension.", format))
.hint(format!("If you wish to compress multiple files, start the extension with '{}'.", format)) .hint(format!("If you wish to compress multiple files, start the extension with '{}'.", format))
.hint(format!("Otherwise, remove the last '{}' from '{}'.", format, to_utf(&output_path))) .hint(format!("Otherwise, remove the last '{}' from '{}'.", format, to_utf(&output_path)));
.clone();
return Err(Error::with_reason(reason)); return Err(Error::with_reason(reason));
} }

View File

@ -70,12 +70,12 @@ impl FinalError {
Self { title: title.to_string(), details: vec![], hints: vec![] } Self { title: title.to_string(), details: vec![], hints: vec![] }
} }
pub fn detail(&mut self, detail: impl ToString) -> &mut Self { pub fn detail(mut self, detail: impl ToString) -> Self {
self.details.push(detail.to_string()); self.details.push(detail.to_string());
self self
} }
pub fn hint(&mut self, hint: impl ToString) -> &mut Self { pub fn hint(mut self, hint: impl ToString) -> Self {
self.hints.push(hint.to_string()); self.hints.push(hint.to_string());
self self
} }
@ -85,70 +85,52 @@ impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let err = match self { let err = match self {
Error::MissingExtensionError(filename) => { Error::MissingExtensionError(filename) => {
let error = FinalError::with_title(format!("Cannot compress to {:?}", filename)) FinalError::with_title(format!("Cannot compress to {:?}", filename))
.detail("Ouch could not detect the compression format") .detail("Ouch could not detect the compression format")
.hint("Use a supported format extension, like '.zip' or '.tar.gz'") .hint("Use a supported format extension, like '.zip' or '.tar.gz'")
.hint("Check https://github.com/vrmiguel/ouch for a full list of supported formats") .hint("Check https://github.com/vrmiguel/ouch for a full list of supported formats")
.clone();
error
} }
Error::WalkdirError { reason } => FinalError::with_title(reason), Error::WalkdirError { reason } => FinalError::with_title(reason),
Error::FileNotFound(file) => { Error::FileNotFound(file) => {
let error = if file == Path::new("") { if file == Path::new("") {
FinalError::with_title("file not found!") FinalError::with_title("file not found!")
} else { } else {
FinalError::with_title(format!("file {:?} not found!", file)) FinalError::with_title(format!("file {:?} not found!", file))
}; }
error
} }
Error::CompressingRootFolder => { Error::CompressingRootFolder => {
let error = FinalError::with_title("It seems you're trying to compress the root folder.") FinalError::with_title("It seems you're trying to compress the root folder.")
.detail("This is unadvisable since ouch does compressions in-memory.") .detail("This is unadvisable since ouch does compressions in-memory.")
.hint("Use a more appropriate tool for this, such as rsync.") .hint("Use a more appropriate tool for this, such as rsync.")
.clone();
error
} }
Error::MissingArgumentsForCompression => { Error::MissingArgumentsForCompression => {
let error = FinalError::with_title("Could not compress") FinalError::with_title("Could not compress")
.detail("The compress command requires at least 2 arguments") .detail("The compress command requires at least 2 arguments")
.hint("You must provide:") .hint("You must provide:")
.hint(" - At least one input argument.") .hint(" - At least one input argument.")
.hint(" - The output argument.") .hint(" - The output argument.")
.hint("") .hint("")
.hint("Example: `ouch compress image.png img.zip`") .hint("Example: `ouch compress image.png img.zip`")
.clone();
error
} }
Error::MissingArgumentsForDecompression => { Error::MissingArgumentsForDecompression => {
let error = FinalError::with_title("Could not decompress") FinalError::with_title("Could not decompress")
.detail("The compress command requires at least one argument") .detail("The compress command requires at least one argument")
.hint("You must provide:") .hint("You must provide:")
.hint(" - At least one input argument.") .hint(" - At least one input argument.")
.hint("") .hint("")
.hint("Example: `ouch decompress imgs.tar.gz`") .hint("Example: `ouch decompress imgs.tar.gz`")
.clone();
error
} }
Error::InternalError => { Error::InternalError => {
let error = FinalError::with_title("InternalError :(") FinalError::with_title("InternalError :(")
.detail("This should not have happened") .detail("This should not have happened")
.detail("It's probably our fault") .detail("It's probably our fault")
.detail("Please help us improve by reporting the issue at:") .detail("Please help us improve by reporting the issue at:")
.detail(format!(" {}https://github.com/vrmiguel/ouch/issues ", cyan())) .detail(format!(" {}https://github.com/vrmiguel/ouch/issues ", cyan()))
.clone();
error
} }
Error::OofError(err) => FinalError::with_title(err), Error::OofError(err) => FinalError::with_title(err),
Error::IoError { reason } => FinalError::with_title(reason), Error::IoError { reason } => FinalError::with_title(reason),
Error::CompressionTypo => FinalError::with_title("Possible typo detected") Error::CompressionTypo => FinalError::with_title("Possible typo detected")
.hint(format!("Did you mean '{}ouch compress{}'?", magenta(), reset())) .hint(format!("Did you mean '{}ouch compress{}'?", magenta(), reset())),
.clone(),
Error::UnknownExtensionError(_) => todo!(), Error::UnknownExtensionError(_) => todo!(),
Error::AlreadyExists => todo!(), Error::AlreadyExists => todo!(),
Error::InvalidZipArchive(_) => todo!(), Error::InvalidZipArchive(_) => todo!(),