Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change FinalError builder pattern to take and give ownership of self #97

Merged
merged 4 commits into from
Oct 15, 2021
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 3 additions & 6 deletions src/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,7 @@ pub fn run(command: Command, flags: &oof::Flags) -> crate::Result<()> {
.hint("")
.hint("Examples:")
.hint(format!(" ouch compress ... {}.tar.gz", to_utf(&output_path)))
.hint(format!(" ouch compress ... {}.zip", to_utf(&output_path)))
.clone();
.hint(format!(" ouch compress ... {}.zip", to_utf(&output_path)));

return Err(Error::with_reason(reason));
}
Expand Down Expand Up @@ -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.")
.hint(format!("Try inserting '.tar' or '.zip' before '{}'.", &formats[0]))
.hint(format!("From: {}", output_path))
.hint(format!(" To : {}", suggested_output_path))
.clone();
.hint(format!(" To : {}", suggested_output_path));

return Err(Error::with_reason(reason));
}
Expand All @@ -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!("'{}' 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!("Otherwise, remove the last '{}' from '{}'.", format, to_utf(&output_path)))
.clone();
.hint(format!("Otherwise, remove the last '{}' from '{}'.", format, to_utf(&output_path)));

return Err(Error::with_reason(reason));
}
Expand Down
79 changes: 29 additions & 50 deletions src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,12 +70,12 @@ impl FinalError {
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
}

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
}
Expand All @@ -85,70 +85,49 @@ impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let err = match self {
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")
.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")
.clone();

error
}
Error::WalkdirError { reason } => FinalError::with_title(reason),
Error::FileNotFound(file) => {
let error = if file == Path::new("") {
if file == Path::new("") {
FinalError::with_title("file not found!")
} else {
FinalError::with_title(format!("file {:?} not found!", file))
};

error
}
}
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.")
.hint("Use a more appropriate tool for this, such as rsync.")
.clone();

error
}
Error::MissingArgumentsForCompression => {
let error = FinalError::with_title("Could not compress")
.detail("The compress command requires at least 2 arguments")
.hint("You must provide:")
.hint(" - At least one input argument.")
.hint(" - The output argument.")
.hint("")
.hint("Example: `ouch compress image.png img.zip`")
.clone();

error
}
Error::MissingArgumentsForDecompression => {
let error = FinalError::with_title("Could not decompress")
.detail("The compress command requires at least one argument")
.hint("You must provide:")
.hint(" - At least one input argument.")
.hint("")
.hint("Example: `ouch decompress imgs.tar.gz`")
.clone();

error
}
Error::InternalError => {
let error = FinalError::with_title("InternalError :(")
.detail("This should not have happened")
.detail("It's probably our fault")
.detail("Please help us improve by reporting the issue at:")
.detail(format!(" {}https://github.com/vrmiguel/ouch/issues ", cyan()))
.clone();

error
}
Error::MissingArgumentsForCompression => FinalError::with_title("Could not compress")
.detail("The compress command requires at least 2 arguments")
.hint("You must provide:")
.hint(" - At least one input argument.")
.hint(" - The output argument.")
.hint("")
.hint("Example: `ouch compress image.png img.zip`"),
Error::MissingArgumentsForDecompression => FinalError::with_title("Could not decompress")
.detail("The compress command requires at least one argument")
.hint("You must provide:")
.hint(" - At least one input argument.")
.hint("")
.hint("Example: `ouch decompress imgs.tar.gz`"),
Error::InternalError => FinalError::with_title("InternalError :(")
.detail("This should not have happened")
.detail("It's probably our fault")
.detail("Please help us improve by reporting the issue at:")
.detail(format!(" {}https://github.com/vrmiguel/ouch/issues ", cyan())),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same thing here that happened to me previously, the formatting is terrible because we dropped the unstable rustfmt features. (it's crazy that this rustfmt feature should be stable already, it's been like 30 months).

Could you add this back 588359e and run cargo fmt on the project? I personally hate how multiline braces stay squished together without this config.

In rustfmt.toml:

unstable_features = true
force_multiline_blocks = true

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When running cargo fmt I get

Warning: can't set `force_multiline_blocks = true`, unstable features are only available in nightly channel.
Warning: can't set `unstable_features = true`, unstable features are only available in nightly channel.

Do we need to enable rust nightly just for this?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, that's what makes the warnings go away, but is it worth it using nightly just for rust fmt?

Copy link
Member

@marcospb19 marcospb19 Oct 15, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's ok to use nightly but it's probably because I always use it anyways, what do you think?

I don't know why rust-lang/rustfmt/issues/3374 is not stable yet.

I have been using nightly mainly because of rustfmt, eventually I experience with some feature.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It will probably be fine, we are not using any unstable features anyway so I don't think anything will break.
And yeah, it looks like this should be stable, you can probably open a pr yourself for it. I did it once for a method I needed and it was fairly simple process, I assume it will be similar for fmt

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Interesting, I'll try doing it later, maybe asking in the Zulip first will help, people are very active there.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah zulip is a great place. I messed up git at some point and one of the core members personally took the time to help me clean it up

Error::OofError(err) => FinalError::with_title(err),
Error::IoError { reason } => FinalError::with_title(reason),
Error::CompressionTypo => FinalError::with_title("Possible typo detected")
.hint(format!("Did you mean '{}ouch compress{}'?", magenta(), reset()))
.clone(),
Error::CompressionTypo => FinalError::with_title("Possible typo detected").hint(format!(
"Did you mean '{}ouch compress{}'?",
magenta(),
reset()
)),
Error::UnknownExtensionError(_) => todo!(),
Error::AlreadyExists => todo!(),
Error::InvalidZipArchive(_) => todo!(),
Expand Down