From d8df77a971d6bdd911d1d49cbd872e91427ae984 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sat, 11 Dec 2021 09:35:19 +0200 Subject: feat! collect errors from diagram rendering The errors are always rendered into the document. The caller can get them with the DiagramFilter::errors method and can decide what to do if there are any. This also changes the function signature for DiagramFilter::error_block, which is SemVer incompatible. Sponsored-by: author --- src/lib.rs | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index c7c3bc5..0f7b2a1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -32,6 +32,7 @@ pub struct DiagramFilter { roadmap_width: usize, java_path: PathBuf, plantuml_jar: PathBuf, + errors: Vec, } /// Possible errors for diagram filtering. @@ -81,6 +82,7 @@ impl Default for DiagramFilter { roadmap_width: 50, java_path: PathBuf::from("java"), plantuml_jar: PathBuf::from("/usr/share/plantuml/plantuml.jar"), + errors: vec![], } } } @@ -90,6 +92,10 @@ impl DiagramFilter { Self::default() } + pub fn errors(&self) -> &[DiagramError] { + &self.errors + } + pub fn dot_path

(&mut self, path: P) -> &mut Self where P: AsRef, @@ -124,7 +130,7 @@ impl DiagramFilter { doc } - fn error_block(&self, error: DiagramError) -> Block { + fn error_block(&self, error: &DiagramError) -> Block { let msg = Inline::Str(format!("ERROR: {}", error.to_string())); let msg = vec![Inline::Strong(vec![msg])]; Block::Para(msg) @@ -228,12 +234,12 @@ fn filter_via( } else { String::from("terminated by signal") }; - let stderr = String::from_utf8_lossy(&output.stderr); + let stderr = String::from_utf8_lossy(&output.stderr).into_owned(); Err(DiagramError::HelperFailed( name.to_string(), argv0.to_path_buf(), status, - stderr.into_owned(), + stderr, )) } } else { @@ -255,19 +261,31 @@ impl MutVisitor for DiagramFilter { match block { Block::CodeBlock((_id, classes, _kv), text) => match DiagramKind::from(classes) { DiagramKind::GraphvizDot => match self.dot_to_svg(text) { - Err(err) => *block = self.error_block(err), + Err(err) => { + *block = self.error_block(&err); + self.errors.push(err); + } Ok(svg) => *block = self.svg_block(&svg), }, DiagramKind::Roadmap => match self.roadmap_to_svg(text) { - Err(err) => *block = self.error_block(err), + Err(err) => { + *block = self.error_block(&err); + self.errors.push(err); + } Ok(svg) => *block = self.svg_block(&svg), }, DiagramKind::Plantuml => match self.plantuml_to_svg(text) { - Err(err) => *block = self.error_block(err), + Err(err) => { + *block = self.error_block(&err); + self.errors.push(err); + } Ok(svg) => *block = self.svg_block(&svg), }, DiagramKind::Pikchr => match self.pikchr_to_svg(text, None) { - Err(err) => *block = self.error_block(err), + Err(err) => { + *block = self.error_block(&err); + self.errors.push(err); + } Ok(svg) => *block = self.svg_block(&svg), }, DiagramKind::Svg => *block = self.svg_block(text.as_bytes()), -- cgit v1.2.1