summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/renderer.rs32
1 files changed, 28 insertions, 4 deletions
diff --git a/src/renderer.rs b/src/renderer.rs
index 88f3623..a70c3be 100644
--- a/src/renderer.rs
+++ b/src/renderer.rs
@@ -35,16 +35,28 @@ impl<W: Write> Renderer<W> {
}
pub fn render_file<R: Read>(&mut self, filename: &Path, mut reader: R) -> std::io::Result<()> {
- let mut buf = String::new();
- reader.read_to_string(&mut buf)?;
+ let mut bytes = Vec::new();
+ reader.read_to_end(&mut bytes)?;
+ let contents = if let Ok(utf8string) = std::str::from_utf8(&bytes) {
+ utf8string
+ } else {
+ return self.render_binary_file(filename);
+ };
let name = render_filename(filename);
- let fence = outer_backticks(&buf);
+ let fence = outer_backticks(contents);
writeln!(self.output)?;
writeln!(self.output, "## File: {}", name)?;
writeln!(self.output, "{}", fence)?;
- writeln!(self.output, "{}", buf)?;
+ writeln!(self.output, "{}", contents)?;
writeln!(self.output, "{}", fence)
}
+
+ fn render_binary_file(&mut self, filename: &Path) -> std::io::Result<()> {
+ let name = render_filename(filename);
+ writeln!(self.output)?;
+ writeln!(self.output, "## File: {}", name)?;
+ writeln!(self.output, "[BINARY FILE]")
+ }
}
pub fn render(project_name: &str, files: &[(&Path, &[u8])]) -> Result<String, RenderError> {
@@ -208,4 +220,16 @@ mod tests {
assert_eq!(String::from_utf8(output).unwrap(), expected);
}
+
+ #[test]
+ fn renderer_places_a_placeholder_for_binary_files_by_default() {
+ let mut output = Vec::new();
+ let mut renderer = Renderer::new(&mut output);
+
+ let input = Cursor::new(&[0x00, 0x01, 0x02, 0xc3]);
+ renderer.render_file(Path::new("image.png"), input).unwrap();
+ let expected = "\n## File: image.png\n[BINARY FILE]\n";
+
+ assert_eq!(String::from_utf8(output).unwrap(), expected);
+ }
}