aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorboasting-squirrel <boasting.squirrel@gmail.com>2019-03-12 18:23:22 +0000
committerboasting-squirrel <boasting.squirrel@gmail.com>2019-03-12 18:23:22 +0000
commit67d771fc3a954ea439e77afac092c84c5489d074 (patch)
tree2316eaa7ee80299abbc5fbb066cf1663e44e3461
parentStarted to add helpful messages for errors which could occur during archiving (diff)
downloadminiserve-67d771fc3a954ea439e77afac092c84c5489d074.tar.gz
miniserve-67d771fc3a954ea439e77afac092c84c5489d074.zip
Added some error messages + reworked the print_error_chain method
Diffstat (limited to '')
-rw-r--r--src/archive.rs17
-rw-r--r--src/errors.rs28
-rw-r--r--src/listing.rs14
3 files changed, 38 insertions, 21 deletions
diff --git a/src/archive.rs b/src/archive.rs
index afbcc6b..556fd69 100644
--- a/src/archive.rs
+++ b/src/archive.rs
@@ -126,12 +126,17 @@ fn tar(
/// Compresses a stream of bytes using the GZIP algorithm
fn gzip(mut data: &[u8]) -> Result<Vec<u8>, errors::CompressionError> {
let mut encoder =
- Encoder::new(Vec::new()).context(errors::CompressionErrorKind::GZipBuildingError)?;
- io::copy(&mut data, &mut encoder).context(errors::CompressionErrorKind::GZipBuildingError)?;
- let data = encoder
- .finish()
- .into_result()
- .context(errors::CompressionErrorKind::GZipBuildingError)?;
+ Encoder::new(Vec::new()).context(errors::CompressionErrorKind::GZipBuildingError {
+ message: "failed to create GZIP encoder".to_string(),
+ })?;
+ io::copy(&mut data, &mut encoder).context(errors::CompressionErrorKind::GZipBuildingError {
+ message: "failed to write GZIP data".to_string(),
+ })?;
+ let data = encoder.finish().into_result().context(
+ errors::CompressionErrorKind::GZipBuildingError {
+ message: "failed to write GZIP trailer".to_string(),
+ },
+ )?;
Ok(data)
}
diff --git a/src/errors.rs b/src/errors.rs
index c85d123..191d382 100644
--- a/src/errors.rs
+++ b/src/errors.rs
@@ -1,9 +1,9 @@
use failure::{Backtrace, Context, Fail};
use std::fmt::{self, Debug, Display};
-use yansi::Color;
+use yansi::{Color, Paint};
/// Kinds of error which might happen during folder archive generation
-#[derive(Clone, Debug, PartialEq, Eq, Fail)]
+#[derive(Debug, Fail)]
pub enum CompressionErrorKind {
#[fail(display = "Could not open file {}", path)]
OpenFileError { path: String },
@@ -17,21 +17,37 @@ pub enum CompressionErrorKind {
InvalidDirectoryName,
#[fail(display = "Failed to create the TAR archive: {}", message)]
TarBuildingError { message: String },
- #[fail(display = "Failed to create the GZIP archive")]
- GZipBuildingError,
+ #[fail(display = "Failed to create the GZIP archive: {}", message)]
+ GZipBuildingError { message: String },
#[fail(display = "Failed to retrieve TAR content")]
TarContentError,
#[fail(display = "Failed to retrieve GZIP content")]
GZipContentError,
}
-pub fn print_chain(err: CompressionError) {
+pub fn print_error_chain(err: CompressionError) {
+ println!(
+ "{error} {err}",
+ error = Paint::red("error:").bold(),
+ err = Paint::white(&err).bold()
+ );
+ print_backtrace(&err);
for cause in Fail::iter_causes(&err) {
println!(
"{} {}",
- Color::Magenta.paint("Caused by:").to_string(),
+ Color::RGB(255, 192, 0).paint("caused by:").to_string(),
cause
);
+ print_backtrace(cause);
+ }
+}
+
+fn print_backtrace(err: &dyn Fail) {
+ if let Some(backtrace) = err.backtrace() {
+ let backtrace = backtrace.to_string();
+ if backtrace != "" {
+ println!("{}", backtrace);
+ }
}
}
diff --git a/src/listing.rs b/src/listing.rs
index ab3b28b..a9f0f19 100644
--- a/src/listing.rs
+++ b/src/listing.rs
@@ -7,7 +7,7 @@ use serde::Deserialize;
use std::io;
use std::path::Path;
use std::time::SystemTime;
-use yansi::{Color, Paint};
+use yansi::Color;
use crate::archive;
use crate::errors;
@@ -238,8 +238,9 @@ pub fn directory_listing<S>(
match archive::create_archive_file(&compression_method, &dir.path) {
Ok((filename, content)) => {
println!(
- "{success} Archive successfully created !",
- success = Color::Green.paint("success:").bold()
+ "{success} {file} successfully created !",
+ success = Color::Green.paint("success:").bold(),
+ file = Color::White.paint(&filename).bold(),
);
Ok(HttpResponse::Ok()
.content_type(compression_method.content_type())
@@ -254,12 +255,7 @@ pub fn directory_listing<S>(
.body(Body::Streaming(Box::new(once(Ok(content))))))
}
Err(err) => {
- println!(
- "{error} {err}",
- error = Paint::red("error:").bold(),
- err = Paint::white(&err).bold()
- );
- errors::print_chain(err);
+ errors::print_error_chain(err);
Ok(HttpResponse::Ok()
.status(http::StatusCode::INTERNAL_SERVER_ERROR)
.body(""))