summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2021-12-11 09:35:19 +0200
committerLars Wirzenius <liw@liw.fi>2021-12-11 10:55:33 +0200
commitd8df77a971d6bdd911d1d49cbd872e91427ae984 (patch)
tree5140c49110d0891cbc6a45c77001dcaf9edb89df
parent1605867b8e6b37160e527c9439322fc40ac6cce9 (diff)
downloadpandoc-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.rs32
1 files 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<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()),