diff options
-rw-r--r-- | src/archive.rs | 17 | ||||
-rw-r--r-- | src/errors.rs | 28 | ||||
-rw-r--r-- | src/listing.rs | 14 |
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("")) |