diff options
author | Lars Wirzenius <liw@liw.fi> | 2021-12-11 09:35:19 +0200 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2021-12-11 10:55:33 +0200 |
commit | d8df77a971d6bdd911d1d49cbd872e91427ae984 (patch) | |
tree | 5140c49110d0891cbc6a45c77001dcaf9edb89df | |
parent | 1605867b8e6b37160e527c9439322fc40ac6cce9 (diff) | |
download | pandoc-filter-diagram-d8df77a971d6bdd911d1d49cbd872e91427ae984.tar.gz |
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
-rw-r--r-- | src/lib.rs | 32 |
1 files changed, 25 insertions, 7 deletions
@@ -32,6 +32,7 @@ pub struct DiagramFilter { roadmap_width: usize, java_path: PathBuf, plantuml_jar: PathBuf, + errors: Vec<DiagramError>, } /// 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<P>(&mut self, path: P) -> &mut Self where P: AsRef<Path>, @@ -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()), |